Прямой проблемой, на мой взгляд, является то, что вы привязываете это событие к кнопке, которая пытается преобразовать отправителя в текстовый ввод. Поскольку отправитель становится элементом управления кнопкой, а не текстовым полем, вы получите исключение nullreference.
Если вы ищете что-то, связанное с кликом, у вас есть несколько вариантов:
- Жесткий код списка элементов управления, который вы хотите проверить и реорганизовать функцию проверки, чтобы принять элемент управления, который вы проверяете (на самом деле я бы в любом случае реорганизовал этот способ).
- [рекурсивно] перебирает элементы управления в форме (используя возможно this.Controls и передавая свойство
Controls
для каждого элемента контейнера). Затем еще раз передайте эти элементы управления, которые вы обнаружите, что хотите подтвердить обратно в метод проверки.
, например
// your validation method accepting the control
private void ValidateTextBox(TextBox textbox)
{
// validation code here
}
// bind to click event for button
private void btnValidate_Click(object Sender, EventArgs e)
{
// you can do manual reference:
List<TextBox> textboxes = new List<TextBoxes>();
textboxes.AddRange(new[]{
this.mytextbox,
this.mysecondtextbox,
...
});
//---or---
// Use recursion and grab the textbox controls (maybe using the .Tag to flag this is
// on you'd like to validate)
List<TextBox> textboxes = FindTextBoxes(this.Controls);
//---then---
// iterate over these textboxes and validate them
foreach (TextBox textbox in textboxes)
ValidateTextBox(textbox);
}
И чтобы дать вам представление о рекурсивном захвате управления:
private List<TextBox> FindTextBoxes(ControlsCollection controls)
{
List<TextBox> matches = new List<TextBox>();
foreach (Control control in collection)
{
// it's a textbox
if (control is TextBox)
matches.Add(control as TextBox);
// it's a container with more controls (recursion)
else if (control is Panel) // do this for group boxes, etc. too
matches.AddRange((control as Panel).Controls);
// return result
return matches;
}
}