Есть ли более эффективный способ установить переменные в событии RadioButton CheckChanged? - PullRequest
2 голосов
/ 30 марта 2010

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

private void Foo_CheckedChanged(object sender, EventArgs e)
    {
        convertSource = 1;
    }

private void Bar_CheckedChanged(object sender, EventArgs e)
    {
        convertSource = 2;
    }

private void Baz_RadioButton_CheckedChanged(object sender, EventArgs e)
    {
        convertSource = 3;
    }

Теперь, я думал об этом и, честно говоря, подумал, что мог бы быть способ сделать это с помощью переключателя ... Я просто не могу осмыслить это в уме.

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

спасибо, cpatton

Ответы [ 2 ]

0 голосов
/ 30 марта 2010

Вы можете привязать один и тот же обработчик к нескольким событиям. Вы можете написать один обработчик и проверить, кто является отправителем:

private void RadioButton_CheckedChanged(object sender, EventArgs e)
{
    if (sender == Foo_RadioButton) {
        convertSource = 1;
    } else if (sender == Bar_RadioButton) {
        convertSource = 2;
    } else if (sender == Baz_RadioButton) {
        convertSource = 3;
    } else {
        // Error
    }
}

или даже более кратко:

private void RadioButton_CheckedChanged(object sender, EventArgs e)
{
    List<RadioButton> radioButtons = new List<RadioButton> {
        Foo_RadioButton,
        Bar_RadioButton,
        Baz_RadioButton
    };

    int index = radioButton.IndexOf((RadioButton)sender);
    convertSource = index + 1;
}        

Вы можете привязать этот обработчик к событию CheckedChanged в окне свойств для каждого переключателя.

0 голосов
/ 30 марта 2010

Лично я ненавижу радиокнопки, если есть более 2 или 3 вариантов - ComboBox - лучший выбор для выбора одного варианта из многих.

Однако, быстрое решение вашей проблемы - поместить значение convertSource каждой радиокнопки в свойство Tag этого элемента управления (сделайте это в конструкторе). Добавьте этот метод к вашей форме:

private void rb_CheckedChanged(object sender, EventArgs e) 
{ 
    convertSource = (int)((RadioButton)sender).Tag;
}

В событии загрузки вашей формы (при условии, что все эти переключатели находятся в групповом поле), присвойте обработчик следующим образом:

foreach (RadioButton rb in groupBox1.Controls)
{
    rb.CheckedChanged += rb_CheckedChange;
}

Убедитесь, что вы удалили все обработчики событий, которые вы добавили вручную (например, Foo_CheckedChanged).

...