Để sử dụng xác nhận xử lý như 'txtIPAddress_Validating()' xử lý bên dưới khi có thể đóng biểu mẫu mà không phải nhập các mục hợp lệ để làm như vậy, tôi thực hiện như sau:
1) Trình xử lý bắt buộc xác nhận hợp lệ: Từ các thuộc tính điều khiển của điều khiển mà bạn muốn kích hoạt xác thực, nhấp đúp vào sự kiện 'Đang xác thực' từ danh sách sự kiện kiểm soát này. Danh sách sự kiện kiểm soát được truy cập bằng cách nhấp vào nút thanh công cụ sự kiện của trang thuộc tính (sét tìm kiếm) của bảng điều khiển này. Sau đó, bạn có thể nhập mã trong trình xử lý được tạo tự động với tên kết hợp cả tên của điều khiển và '_Validating'. Một phần của trình xử lý này, nơi một cái gì đó được thiết lập là không hợp lệ có thể ép buộc các mục hợp lệ bằng cách thêm lệnh 'e.Cancel = true'.
Ví dụ về phương pháp xác thực như vậy, hãy xem mã 'txtIPAddress_Validating()' và 'txtMaskBits_Validating()' bên dưới. Không bị phân tâm bởi cơ chế xác thực hoàn chỉnh của các ví dụ cụ thể này. Tất cả những gì bạn cần xem và tái tạo trong mã của riêng bạn để bắt buộc xác nhận là thêm lệnh 'e.Cancel = true' vào đúng vị trí của phương thức xác thực của riêng bạn. Đó là khi giá trị được xác định là không hợp lệ. Tại thời điểm này việc xác nhận sẽ hoạt động tốt nhưng bất kỳ nỗ lực nào để đóng biểu mẫu sẽ kích hoạt xác thực sẽ dừng và nhấn mạnh các giá trị hợp lệ trước khi có thể đóng biểu mẫu. Đây không phải lúc nào bạn muốn. Khi nó không phải như vậy, tôi tiếp tục với những điều sau đây.
2) 'Hủy' nút đó cũng hủy bỏ (disable) tất cả các kiểm chứng thực:
a) Đặt một nút 'Cancel' thường xuyên trên các hình thức đó là liên kết đến một phương pháp như 'btnCancel_Click()' phương pháp phía dưới.
b) Trước thông thường 'this.close();' hướng dẫn, thêm 'AutoValidate = AutoValidate.Disable;' chỉ dẫn. Lệnh này vô hiệu hóa tất cả các trình kích hoạt 'xác thực'. Lưu ý rằng sự kiện 'btnCancel_Click' được kích hoạt trước khi thực hiện bất kỳ xác thực nào. Đó không phải là như vậy cho các sự kiện Form Closing mà tất cả sẽ thực hiện sau khi xác nhận các sự kiện. Đó là lý do tại sao không thể vô hiệu hóa việc xác nhận hợp lệ từ bất kỳ sự kiện nào trong các biểu mẫu này.
c) Để nút 'Hủy' này hoạt động chính xác, bạn cũng cần đặt thuộc tính 'Nguyên nhân xác thực' của nút 'Hủy' này thành 'sai'. Điều này là cần thiết, nếu không nhấp vào nút này sẽ kích hoạt xác thực trước khi xác thực có thể bị vô hiệu hóa bởi 'AutoValidate = AutoValidate.Disable' ở trên; chỉ dẫn.
Tại thời điểm này, bạn có thể thoát bằng cách nhấp vào nút 'Hủy' mà không phải nhập các giá trị hợp lệ trước tiên. Tuy nhiên, việc nhấp vào nút "X" phía trên bên phải của cửa sổ biểu mẫu sẽ vẫn bắt buộc xác thực.
3) Thực hiện quyền nút trên "X" cũng hủy bỏ xác nhận:
Thách thức ở đây là cái bẫy như vậy "X" nhấp kiện trước khi xác nhận được thực thi. Bất kỳ nỗ lực nào để thực hiện điều đó thông qua trình xử lý Biểu mẫu đóng sẽ không hoạt động vì nó quá muộn sau khi thực hiện đạt được trình xử lý đó. Tuy nhiên, nhấn nút "X" có thể được chụp nhanh bằng cách ghi đè phương thức WndProc() và kiểm tra điều kiện 'm.Msg == 0x10'. Khi điều kiện đó là đúng, 'AutoValidate = AutoValidate.Disable được giới thiệu trước đây' hướng dẫn một lần nữa có thể được sử dụng để vô hiệu hóa xác nhận tổng thể trong trường hợp đó là tốt. Xem phương thức WndProc() bên dưới để biết mẫu mã của phương thức đó. Bạn sẽ có thể sao chép và dán phương thức đó như trong lớp của biểu mẫu của bạn.
Tại thời điểm này, cả nút 'Hủy' một "X" sẽ hủy bỏ các giá trị. Tuy nhiên, phím thoát có thể được sử dụng để đóng một biểu mẫu thì không. Phím thoát như vậy được kích hoạt khi thuộc tính 'CancelButton' của biểu mẫu được sử dụng để liên kết khóa thoát này với nút 'Hủy' của biểu mẫu.
4) Tận dụng phím Esc cũng hủy bỏ xác nhận:
Tương tự như nút "X", chìa khóa thoát có thể được chụp bằng cách ghi đè một existingmethod. Đó là phương thức ProcessDialogKey(). Một lần nữa, 'AutoValidate = AutoValidate.Disable được giới thiệu trước đây' hướng dẫn có thể được sử dụng để vô hiệu hóa xác nhận tổng thể cho phím thoát là tốt. Xem phương thức ghi đè ‘ProcessDialogKey()’ trong mã bên dưới để xem cách thực hiện điều này. Ở đây một lần nữa, bạn sẽ có thể sao chép và dán phương thức đó như trong lớp của biểu mẫu của riêng bạn.
Tại thời điểm này, bạn nên làm!
cân nhắc thêm:
Nó là tốt để nhận thấy rằng hai cách khác sau đây để đóng cửa sổ cũng nên làm việc tốt vào thời điểm này. Hai cách này là:
- Tùy chọn 'Đóng' của nút biểu tượng cửa sổ phía trên bên trái.
- Nhấn Alt + F4 sẽ kích hoạt hành động đóng giống như tùy chọn 'Đóng' ở trên.
Hai cách đóng cửa sổ này cũng bắt đầu hủy xác thực khi bạn đã giới thiệu cơ chế chụp nút "X" được mô tả ở điểm 3 ở trên.
Điều đó là dành cho tôi cho đến thời điểm này. Hy vọng điều này sẽ giúp bạn!
mẫu mã của tôi dưới đây:
public partial class frmMyIP : Form
{
public frmMyIP()
{
InitializeComponent();
}
// To capture the Upper right "X" click
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x10) // The upper right "X" was clicked
{
AutoValidate = AutoValidate.Disable; //Deactivate all validations
}
base.WndProc(ref m);
}
// To capture the "Esc" key
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Escape)
{
AutoValidate = AutoValidate.Disable;
btnCancel.PerformClick();
return true;
}
return base.ProcessDialogKey(keyData);
}
public bool IsValidIP(string ipaddr)
{
string pattern = @"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"+
@"(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$";
Regex check = new Regex(pattern);
bool valid = false;
if (ipaddr == "")
{
valid = false;
}
else
{
valid = check.IsMatch(ipaddr, 0);
}
return valid;
}
private void txtIPAddress_Validating(object sender, CancelEventArgs e)
{
string address = txtIPAddress.Text;
if (!IsValidIP(address))
{
MessageBox.Show("Invalid IP address!");
e.Cancel = true;
}
}
private void cmbMaskBits_Validating(object sender, CancelEventArgs e)
{
int MaskBitsValue = Convert.ToInt32(cmbMaskBits.Text);
if (MaskBitsValue<1 || MaskBitsValue>30)
{
MessageBox.Show("Please select a 'Mask Bits' value between 1 and 30!");
e.Cancel = true;
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
// Stop the validation of any controls so the form can close.
// Note: The CausesValidation property of this <Cancel> button
// must also be set to false.
AutoValidate = AutoValidate.Disable;
this.Close();
}
Có lẽ câu trả lời này: http://stackoverflow.com/a/25479010/1586914 có thể giúp ích? – Adiono