【问题标题】:Is there a more efficient way to set variables on a RadioButton's CheckChanged event?有没有更有效的方法在 Radio Button CheckedChanged 事件上设置变量?
【发布时间】:2011-02-02 07:07:44
【问题描述】:

我的应用程序中有 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 行代码,这让我很烦恼。

谢谢, 帕顿

【问题讨论】:

  • 通过更有效的方法,您的意思是更简单/更清洁/更少代码的东西吗?如果效率是指运行时性能,我怀疑它可能比您已经在做的要快得多。
  • 我认为他的意思是编写它需要多长时间而不是运行速度。

标签: windows events forms radio-button


【解决方案1】:

就个人而言,如果有超过 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)。

【讨论】:

  • 啊,谢谢!我不知道为什么我决定为这个特定任务使用单选按钮.. 组合框更有意义,所以我想我会这样做。谢谢你,我真的很感谢你的时间和精力。
【解决方案2】:

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

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 事件。

【讨论】:

  • 啊,非常感谢!实际上,我将为我的应用程序的这一部分使用一个组合框,因为它更有意义。不过,我没想过只使用一个处理程序并检查发件人。这是个好主意,我很感激。可能会将它用于我的应用程序的另一部分:)
猜你喜欢
  • 2011-05-20
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2012-06-05
  • 2016-11-03
  • 1970-01-01
相关资源
最近更新 更多