Установить событие TextChanged для текстовых полей в winforms - PullRequest
1 голос
/ 20 декабря 2010

У меня есть форма с восемью текстовыми полями, и теперь я хочу, чтобы всякий раз, когда какой-либо пользователь выполнял событие с измененным текстом в любом текстовом поле, кнопка отключалась.

Нужно ли связывать событие textChanged со всеми текстовыми полями, или есть какой-нибудь лучший подход?

Что если позже я захочу добавить больше текстовых полей в мои winforms?

1 Ответ

4 голосов
/ 20 декабря 2010

Если по какой-то причине вам не нужно привязывать один и тот же обработчик событий к 8+ текстовым полям в конструкторе, вы можете сделать это программно в событии загрузки формы:

private void MainForm_Load(object sender, EventArgs e)
{
    foreach (Control maybeTextBox in Controls)
    {
         if (maybeTextBox is TextBox)
         { 
             maybeTextBox.TextChanged += new EventHandler(maybeTextBox_TextChanged);
         }
    }
}

Единственная проблема с этим заключается в том, что если какой-либо из TextBox находится внутри другого элемента управления, вам нужно написать рекурсивный метод поиска, подобный этому:

public static Control[] GetControls(Control findIn)
{
    List<Control> allControls = new List<Control>();
    foreach (Control oneControl in findIn.Controls)
    {
        allControls.Add(OneControl);
        if (OneControl.Controls.Count > 0)
            allControls.AddRange(GetControls(oneControl));
    }
    return allControls.ToArray();
}

Вы можете вызвать этот метод в форме, поэтому исходный код станет:

foreach (Control maybeTextBox in GetControls(this))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...