所以我有一个事件可以通过更改某些复选框和一些radiobutton的选中值来触发。我想获得触发事件的控件的Checked值。我知道,如果它是一个复选框,我可以做bool checkedValue = (sender as CheckBox).Checked;
之类的事情
(对于无线电按钮也是如此)。但是,如果我不知道控件的类型怎么办?两个人都有课吗?
答案 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
。作为建议创建CheckBox
和RadioButton
的两个子类,声明一个接口,即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;