获取C#中的单选按钮和复选框的选中值

时间:2011-02-21 11:24:11

标签: c# winforms

所以我有一个事件可以通过更改某些复选框和一些radiobutton的选中值来触发。我想获得触发事件的控件的Checked值。我知道,如果它是一个复选框,我可以做bool checkedValue = (sender as CheckBox).Checked;之类的事情 (对于无线电按钮也是如此)。但是,如果我不知道控件的类型怎么办?两个人都有课吗?

4 个答案:

答案 0 :(得分:2)

如果你正在运行.NET 4,你可能想尝试这个丑陋的技巧:

private void checkBox1_Click(dynamic sender, EventArgs e) {
    bool isChecked = sender.Checked;
    textBox1.Text = isChecked ? "Checked" : "Unchecked";
}

不是很安全,但很有趣!

答案 1 :(得分:1)

它们都来自ButtonBase,但ButtonBase未实现IsChecked。作为建议创建CheckBoxRadioButton的两个子类,声明一个接口,即IHasCheck,在派生类中正确实现它,并尝试在事件处理程序中强制转换此接口:

 public interface ICheckable
    {
        bool Checked { get; set; }
    }
    class RadioButtonExtended : RadioButton,ICheckable
    {

    }
    class CheckBoxExtended : CheckBox, ICheckable
    { 
    }

答案 2 :(得分:1)

您可以使用控制参数构建一个小函数。然后尝试首先转换为复选框,如果不为null则使用Checked结果。如果为null,请尝试使用单选按钮。如果它也是null,则抛出InvalidParameterException或其他适当的东西。否则返回您保存的值。

bool GetChecked(object ctrl) {
    bool result = false;
    CheckBox cb = ctrl as CheckBox;
    if ( null == cb ) {
        RadioButton rb = ctrl as RadioButton;
        if ( null == rb ) {
             throw new Exception ( "ctrl is of the wrong type " );
        }
        result = rb.Checked;
    } else {
        result = cb.Checked;
    }
    return result;
}

没有尝试编译,只是为了提供这个想法。第二个想法:做一点反思,看看是否有一个名为Checked的属性并获得该值。粗糙,未经测试的代码:

bool GetChecked(object ctrl) {
    bool result = false;
    Type reflectedResult = ctrl.GetType();
    PropertyInfo[] properties = reflectedResult.GetProperties();
    List<System.Reflection.PropertyInfo> properties = ctrl.GetProperties ().Where ( itm => itm.Name == "Checked" ).ToList ();
    if ( properties.Count == 1 )
    {
        bool result = (bool)properties[0].GetValue ( ctrl, null );
    } else {
        throw new Exception ( "ctrl is of the wrong type " );            
    }     
    return result;
}

虽然我不喜欢两者的代码......

答案 3 :(得分:1)

最好的方法是使用界面,但根据你对Felice Pollano的回答,你不想这样做。

然后我会建议在运行时查找类型:

bool checked;
if (sender is CheckBox)
 checked = ((CheckBox)sender).Checked;
if (sender is RadioButton)
 checked = ((RadioButton)sender).Checked;