将CheckBox或单选按钮传递给方法

时间:2013-12-31 15:10:12

标签: c# winforms

目前我将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类的一部分。

6 个答案:

答案 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);
    }
}