Переопределение Eventhandler? - PullRequest
1 голос
/ 24 февраля 2009

Я пытаюсь найти способ легко определить, было ли внесено изменение в элемент управления 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 ]

6 голосов
/ 24 февраля 2009
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);
}
2 голосов
/ 24 февраля 2009

отправитель - это ссылка на элемент управления, вызвавший событие. Если вы делаете

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

Вы увидите, что теперь вы можете использовать «tb», как если бы это было что-то вроде «txtContractName». Если вы хотите использовать определенную логику, вы можете сделать что-то вроде

if(tb == txtBillAddress1) { ... }

Однако на этом этапе вам, вероятно, будет лучше иметь отдельный обработчик событий.

2 голосов
/ 24 февраля 2009

А как насчет параметра отправителя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...