目前我将CB和RD传递给以下方法。
public void objEnabled(System.Windows.Forms.RadioButton x, bool enabled)
{
if (x.InvokeRequired)
{
BeginInvoke(new MyDelegate(delegate()
{
x.Checked = enabled;
}));
}
else
{
x.Checked = enabled;
}
}
public void objEnabled(System.Windows.Forms.CheckBox x, bool enabled)
{
if (x.InvokeRequired)
{
BeginInvoke(new MyDelegate(delegate()
{
x.Checked = enabled;
}));
}
else
{
x.Checked = enabled;
}
}
但我想做类似以下的事情。
public void objChecked(Control x, bool enabled)
{
if (x.InvokeRequired)
{
BeginInvoke(new MyDelegate(delegate()
{
x.Checked = enabled;
}));
}
else
{
x.Checked = enabled;
}
}
我可以使用类似的东西来改变.Text,.Visible和.Enable。但.Checked不是Controls类的一部分。
答案 0 :(得分:1)
Checked属性不是界面的一部分,因此您不能拥有“常用”功能。它们分别在RadioButton和CheckBox中定义。
如果您想将它们视为一个,您可以使用动态关键字让运行时解决它。
public void objChecked(Control x, bool enabled)
{
if(x as RadioButton == null && x as CheckBox == null)
throw new Exception("Not supported");
dynamic runtimeObject = (dynamic)x;
if (x.InvokeRequired)
{
BeginInvoke(new MyDelegate(delegate()
{
runtimeObject.Checked = enabled;
}));
}
else
{
runtimeObject.Checked = enabled;
}
}
答案 1 :(得分:1)
您需要检查类型并相应地进行投射。
if (x is System.Windows.Forms.RadioButton)
(x as System.Windows.Forms.RadioButton).Checked = enabled;
else if (x is System.Windows.Forms.CheckBox)
(x as System.Windows.Forms.CheckBox).Checked = enabled;
答案 2 :(得分:0)
将control x
投射到您想要的类型:例如,(System.Windows.Forms.RadioButton)x
会将x从control
转换为System.Windows.Forms.RadioButton
。然后您应该能够访问其已检查的属性。
我不认为System.Windows.Forms有一个包含Checked
属性的基类,因此您需要将控件转换为具有Checked
的特定实现。
答案 3 :(得分:0)
将x作为radiobutton
投射 public void objChecked(Control c, bool enabled)
{
RadioButton x = c as RadioButton;
if(x == null)
throw new ArgumentException();
if (x.InvokeRequired)
{
BeginInvoke(new MyDelegate(delegate()
{
x .Checked = enabled;
}));
}
else
{
x.Checked = enabled;
}
}
答案 4 :(得分:0)
正如好奇心,不推荐 - 没有演员的其他可能性:
public void objChecked(Control c, bool enabled)
{
Expression property
= Expression.Property(Expression.Constant(c), "Checked");
var lambda = Expression.Lambda<Action>(
Expression.Assign(
property,
Expression.Constant(enabled)))
.Compile();
if (c.InvokeRequired)
{
BeginInvoke(new MyDelegate(delegate()
{
lambda.Invoke();
}));
}
else
{
lambda.Invoke();
}
}
答案 5 :(得分:0)
使用反射。适用于任何名为Checked
的布尔属性的控件。
delegate void MyDelegate(object control, object enabled);
public void objChecked(Control x, bool enabled)
{
System.Reflection.PropertyInfo pi = x.GetType().GetProperty("Checked");
if (pi != null && pi.PropertyType == System.Type.GetType("System.Boolean"))
{
if (x.InvokeRequired)
BeginInvoke(new MyDelegate(pi.SetValue), new object[] { x, enabled });
else
pi.SetValue(x, enabled);
}
}