Windows 有没有更有效的方法在单选按钮上设置变量;是什么改变了事件?

Windows 有没有更有效的方法在单选按钮上设置变量;是什么改变了事件?,windows,events,forms,radio-button,Windows,Events,Forms,Radio Button,我的一个应用程序中有16个单选按钮。。 我必须根据选择的变量设置一个变量。。我已经产生了一些非常丑陋的代码来做这件事 private void Foo_CheckedChanged(object sender, EventArgs e) { convertSource = 1; } private void Bar_CheckedChanged(object sender, EventArgs e) { convertSource = 2

我的一个应用程序中有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;
    }
现在,我一直在考虑这个问题,说实话,我认为可能有一种方法可以通过开关来实现。。我只是无法在脑海中把它概念化

如果有人能告诉我一个更有效的方法,我会非常感激。 像这样一件简单的事情占用了50到70行代码,这真的让我很烦

谢谢,
cpatton

就我个人而言,如果有超过2或3个选项,我讨厌单选按钮,
组合框
是从多个选项中选择一个选项的更好控件

但是,解决问题的一个快速方法是将每个单选按钮的convertSource值放入该控件的
标记
属性(在设计器中执行此操作)。将此方法添加到表单中:

private void rb_CheckedChanged(object sender, EventArgs e) 
{ 
    convertSource = (int)((RadioButton)sender).Tag;
}
在表单的load事件中(假设这些单选按钮都位于一个组框上),按如下方式分配处理程序:

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

请确保删除手动添加的所有事件处理程序(如
Foo_CheckedChanged
)。

就我个人而言,如果有两个或三个以上的选项,我讨厌单选按钮-
组合框是从多个选项中选择一个选项的更好控件

但是,解决问题的一个快速方法是将每个单选按钮的convertSource值放入该控件的
标记
属性(在设计器中执行此操作)。将此方法添加到表单中:

private void rb_CheckedChanged(object sender, EventArgs e) 
{ 
    convertSource = (int)((RadioButton)sender).Tag;
}
在表单的load事件中(假设这些单选按钮都位于一个组框上),按如下方式分配处理程序:

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

确保删除手动添加的所有事件处理程序(如
Foo\u CheckedChanged
)。

可以将同一处理程序绑定到多个事件。您可以编写一个处理程序并检查哪个是发送方:

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;
}        
private void单选按钮\u CheckedChanged(对象发送方,事件参数e)
{
列表单选按钮=新列表{
Foo_单选按钮,
Bar_单选按钮,
巴祖单选按钮
};
int index=radioButton.IndexOf((radioButton)发送方);
convertSource=index+1;
}        

您可以将此处理程序绑定到属性窗口中每个单选按钮的CheckedChanged事件。

您可以将同一处理程序绑定到多个事件。您可以编写一个处理程序并检查哪个是发送方:

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;
}        
private void单选按钮\u CheckedChanged(对象发送方,事件参数e)
{
列表单选按钮=新列表{
Foo_单选按钮,
Bar_单选按钮,
巴祖单选按钮
};
int index=radioButton.IndexOf((radioButton)发送方);
convertSource=index+1;
}        

您可以为每个单选按钮将此处理程序绑定到属性窗口中的CheckedChanged事件。

通过更有效的方法,您的意思是更简单/更干净/更少的代码吗?如果你说的效率是指运行时性能,我怀疑它能比你已经在做的快得多。我认为他说的效率是指编写它所需的时间,而不是它运行的速度。更有效的方法是指更简单/更干净/更少的代码吗?如果你说的效率是指运行时性能,我怀疑它能比你已经在做的快得多。我想他指的效率是指编写它所需的时间,而不是它运行的速度。啊,非常感谢!我将为我的应用程序的这一部分使用一个组合框,因为它更有意义。。不过,我没有想过只使用一个处理程序来检查发送者。这是个好主意,我非常感激。可能会在我的应用程序的另一部分使用它:)啊,非常感谢!我将为我的应用程序的这一部分使用一个组合框,因为它更有意义。。不过,我没有想过只使用一个处理程序来检查发送者。这是个好主意,我非常感激。可能会在我的应用程序的另一部分使用它:)啊,谢谢!我不知道为什么我决定用单选按钮来完成这项任务。。组合框更有意义,所以我想我会选择它。谢谢你,我真的很感谢你的时间和努力。啊,谢谢你!我不知道为什么我决定用单选按钮来完成这项任务。。组合框更有意义,所以我想我会选择它。谢谢你,我真的很感谢你的时间和努力。