System.ComponentModel.CancelEventHandler如何工作?我不明白什么是可取消的事件?

时间:2014-01-31 20:05:13

标签: .net events delegates

我只是在Windows Forms(C#)中开发了一些表单,我很难理解System.ComponentModel.CancelEventHandler的工作原理以及可取消事件的含义。

this.txtName.Validating += new
       System.ComponentModel.CancelEventHandler(this.txtBoxEmpty_Validating);
this.txtAddress.Validating += new
       System.ComponentModel.CancelEventHandler(this.txtBoxEmpty_Validating);

如果有人能解释这个事件处理,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

可取消的事件就是这样,你可以用编程方式取消。在这种情况下,您希望附加到文本框验证事件。在事件处理程序(txtBoxEmpty_Validating)中,您将收到一个类型为CancelEventArgs的参数,该参数具有名为“Cancel”的属性

这一点的重点在于,在您的处理程序中,如果设置Cancel = true,则输入的文本将被视为无效,并且实际上并未设置为文本框的值。

区别在于,可以取消KeyDown事件,但KeyPress可能不会,因为它已经发生。

答案 1 :(得分:1)

TextBox's验证事件的实现类似于:

string previousText = this.Text;
string textThatWasEntered = this.GetInput();

// Update Text with inputted value
this.Text = textThatWasEntered;

// Validate inputted text, giving handlers a chance to cancel
CancelEventArgs cancelEventArgs = new CancelEventArgs();
// call handlers, passing the CancelEventArgs so they can set .Cancel if needed
this.OnValidating(this, cancelEventArgs); 

// If cancelled, reset Text to previous value
if (cancelEventArgs.Cancel) {
   this.Text = previousText;
}

因此,它基本上是一种阻止控制更新的方法。您可以将它用于电子邮件地址验证器:

void txtEmail_Validating(object sender, CancelEventArgs e) {
   string inputtedText = this.txtEmail.Text;
   if (!inputtedText.Contains("@")) {
      // No @ sign - deny update
      e.Cancel = true;
      MessageBox.Show("Invalid email address");
   }
}