У меня есть приложение WinForms, которое содержит много элементов управления NumericUpDown. Короче говоря, если мои пользователи вводят значение в элемент управления, а затем удаляют текст, я хочу восстановить его (текст), когда элемент управления теряет фокус. Поэтому я решил проверить .Text, когда элемент управления теряет фокус, и если он пуст, я установил .Text = .Value.ToString ().
Я делаю это в обработчике событий Leave, и он работает просто отлично. Но, как я уже сказал, у меня есть много таких элементов управления (18, если быть точным). Мне не нравится создавать обработчики событий 18 Leave, которые все делают одно и то же, поэтому я создал общий, такой как:
private void numericUpDown_GenericLeave(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(((NumericUpDown)sender).Text))
((NumericUpDown)sender).Text = ((NumericUpDown)sender).Value.ToString();
}
Я начал подключать все элементы управления к этому универсальному обработчику событий, но я быстро устал от этого:
numericUpDown1.Leave += numericUpDown_GenericLeave;
numericUpDown2.Leave += numericUpDown_GenericLeave;
numericUpDown3.Leave += numericUpDown_GenericLeave;
...
numericUpDown18.Leave += numericUpDown_GenericLeave;
Поэтому я подумал, что создам функцию, которая будет возвращать список всех элементов управления определенного типа, а затем перебирать этот список и подключать обработчики событий. Эта функция выглядит следующим образом:
public static List<Control> GetControlsOfSpecificType(Control container, Type type)
{
var controls = new List<Control>();
foreach (Control ctrl in container.Controls)
{
if (ctrl.GetType() == type)
controls.Add(ctrl);
controls.AddRange(GetControlsOfSpecificType(ctrl, type));
}
return controls;
}
Я вызываю функцию так:
var listOfControls = GetControlsOfSpecificType(this, typeof(NumericUpDown));
foreach (var numericUpDownControl in listOfControls)
{
numericUpDownControl.Leave += numericUpDown_GenericLeave;
}
Однако, когда я запускаю свое приложение, я не вижу ожидаемого поведения, которое возникает, когда я вручную подключаю каждый элемент управления к универсальному обработчику событий. Этот код в настоящее время находится в конструкторе моей формы, и я попытался вызвать его до, а также после вызова InitializeComponent (), но ни один из них, похоже, не работает. Я не получаю никаких ошибок, я просто не вижу ожидаемого поведения. У меня установлена точка останова в общем обработчике событий, но отладчик никогда не прерывается, поэтому кажется, что обработчик событий неправильно подключен. Кто-нибудь знает, почему это может быть или как я могу устранить это дальше? Спасибо!
EDIT
Я только что понял, что звонок:
var listOfControls = GetControlsOfSpecificType(this, typeof(NumericUpDown));
происходило до вызова InitializeComponent (), поэтому, конечно, список возвращаемых элементов управления был пустым. DOH! Спасибо за все ответы. Я извиняюсь за трату времени каждого. : - (