Подключение общих обработчиков событий к нескольким элементам управления одного типа - PullRequest
3 голосов
/ 21 октября 2011

У меня есть приложение 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! Спасибо за все ответы. Я извиняюсь за трату времени каждого. : - (

Ответы [ 3 ]

1 голос
/ 21 октября 2011

Почему бы не создать пользовательский элемент управления с элементом управления NumericUpDown.

Затем обработайте это в событиях управления пользователем.

Это сработало для меня:

 private decimal _previous = 0;

  private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            if (((NumericUpDown)sender).Text.Length > 0)
            {
                _previous = this.numericUpDown1.Value;
            }
        }

        private void UserControl1_Leave(object sender, EventArgs e)
        {
            if (this.numericUpDown1.Text == "")
            {
                this.numericUpDown1.Value = _previous;
                this.numericUpDown1.Text = System.Convert.ToString(_previous);
            }
        }

Просто обратите внимание, что событие Leave находится на пользовательском элементе управления, а не на самом элементе управления Updown.

1 голос
/ 21 октября 2011

Вы передаете this своему методу, который, вероятно, является ссылкой на ваш form.Ваш метод будет перехватывать только те элементы управления, которые размещены непосредственно в вашей форме.Любые элементы управления NumericUpDown, которые не находятся непосредственно в форме (то есть находятся на панели или чем-то еще), будут пропущены.

0 голосов
/ 16 ноября 2011

Вопрос ответил. Смотри Редактировать выше. Спасибо bsegraves за то, что указал мне правильное направление.

...