C# 将复选框或单选按钮传递给方法
目前,我正在将CB和RD传递给以下方法C# 将复选框或单选按钮传递给方法,c#,winforms,C#,Winforms,目前,我正在将CB和RD传递给以下方法 public void objEnabled(System.Windows.Forms.RadioButton x, bool enabled) { if (x.InvokeRequired) { BeginInvoke(new MyDelegate(delegate() { x.Checked = enabled;
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不是控件类的一部分。将
控件x
转换为所需的类型:例如,(System.Windows.Forms.RadioButton)x
将x从控件转换为系统.Windows.Forms.RadioButton
。然后您应该能够访问它的checked属性
我认为System.Windows.Forms没有包含Checked
属性的基类,因此您需要将控件强制转换为已选中的特定实现
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;
}
}
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);
}
}
Checked属性不是接口的一部分,因此不能具有“通用”功能。它们在单选按钮和复选框中分别定义
如果您希望将它们视为一个,那么可以使用dynamic关键字让运行时了解它们
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;
}
}
您需要检查类型并相应地强制转换它
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;
只是出于好奇,不推荐-其他可能性,无需铸造:
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();
}
}
public void objChecked(控件c,bool已启用)
{
表达式属性
=表达式属性(表达式常数(c),“已检查”);
var lambda=表达式.lambda(
表达式.赋值(
财产,,
表达式(常量(已启用)))
.Compile();
如果(c.invokererequired)
{
BeginInvoke(新的MyDelegate(delegate())
{
lambda.Invoke();
}));
}
其他的
{
lambda.Invoke();
}
}
使用反射。将适用于名为已选中的布尔属性的任何控件
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);
}
}
当您从后台线程(因此是BeginInvoke
)检查类似内容时,听起来像是一个设计问题。@UweKeim这是一个自动机器界面,需要显示从串口接收事件接收到的IO控制板响应的视觉统计信息。当您无法设想winform上使用项的所有可能原因时,千万不要认为这是一个设计问题。