Eventhandler覆盖?

时间:2009-02-24 14:50:38

标签: c# .net winforms

我正试图想出一种方法来轻松检测是否对winform上的控件进行了更改。此方法有效,但它不提供有关已更改控件的信息。有没有办法覆盖TextChanged事件,因此它将传递和EventArg,其中包含触发事件的控件的名称?当AccountChangedHandler执行发件人参数时,包含有关文本框的信息,例如'.Text'属性的当前值,但我没有看到有关哪个控件引发事件的任何信息。

private bool _dataChanged = false;

internal TestUserControl()
{
  InitializeComponent();

  txtBillAddress1.TextChanged += new System.EventHandler(AccountChangedHandler);
  txtBillAddress2.TextChanged += new System.EventHandler(AccountChangedHandler);
  txtBillZip.TextChanged += new System.EventHandler(AccountChangedHandler);
  txtBillState.TextChanged += new System.EventHandler(AccountChangedHandler);
  txtBillCity.TextChanged += new System.EventHandler(AccountChangedHandler);
  txtCountry.TextChanged += new System.EventHandler(AccountChangedHandler);

  txtContactName.TextChanged += new System.EventHandler(AccountChangedHandler);
  txtContactValue1.TextChanged += new System.EventHandler(AccountChangedHandler);
  txtContactValue2.TextChanged += new System.EventHandler(AccountChangedHandler);
  txtContactValue3.TextChanged += new System.EventHandler(AccountChangedHandler);
  txtContactValue4.TextChanged += new System.EventHandler(AccountChangedHandler);

}

private void AccountChangedHandler(object sender, EventArgs e)
{
  _dataChanged = true;
}

3 个答案:

答案 0 :(得分:6)

void AccountChangedHandler(object sender, EventArgs e)
{
   string n = ((TextBox)sender).Name;
   string t = ((TextBox)sender).Text;
   // or instead of cast
   TextBox tb = sender as TextBox; // if sender is another type, tb is null
   if(tb != null)
   {
     string n = tb.Name;
     string t = tb.Text;
   }
}

您也可以尝试使用

foreach (Control c in this.Controls)
{
 c.TextChanged += new EventHandler(AccountChangedHandler);
}

答案 1 :(得分:2)

发件人参数怎么样?

答案 2 :(得分:2)

sender是对引发事件的控件的引用。如果你这样做

TextBox tb = sender as TextBox;
string name = tb.Name;

你会看到现在你可以像使用“txtContractName”一样使用“tb”。如果你想做特定的逻辑,你可以做类似

的事情
if(tb == txtBillAddress1) { ... }

但是,此时你可能最好还有一个单独的事件处理程序。