以编程方式单击CheckBox

时间:2009-11-19 15:42:30

标签: c# .net winforms checkbox

有没有办法以编程方式在CheckBox上生成click事件?我正在寻找与Button.PerformClick();

相当的东西

7 个答案:

答案 0 :(得分:9)

为什么需要模拟点击,这行代码是否符合您的需求?

myCheckBox.Checked = !myCheckBox.Checked;

如果您需要在CheckBox状态发生变化时执行逻辑,则应使用CheckedChanged事件而不是Click

private void CheckBox1_CheckedChanged(Object sender, EventArgs e)
{
   MessageBox.Show("You are in the CheckBox.CheckedChanged event.");
}

答案 1 :(得分:3)

上述解决方案调用Checkbox.CheckedChanged事件。

如果您想明确调用Click事件,可以这样:

checkBox1_Click(checkBox1, null);

答案 2 :(得分:2)

为什么要在CheckBox上生成点击事件?

如果你想切换它的值:

theCheckBox.Checked = !theCheckBox.Checked;

如果要触发某些与Click事件相关的功能,最好将代码从Click事件处理程序移到可以从任何地方调用的单独方法中:

private void theCheckBox_Click(object sender, EventArgs e)
{
    HandleCheckBoxClick((CheckBox)sender);
}

private void HandleCheckBoxClick(CheckBox sender)
{
    // do what is needed here
}

当您设计这样的代码时,您可以从任何地方轻松调用该功能:

HandleCheckBoxClick(theCheckBox);

对于大多数控制事件处理程序,可以(也许应该)使用相同的方法;将尽可能多的代码从事件处理程序移动到更可重用的方法中。

答案 3 :(得分:1)

我还在设置一个新的工作站,所以我暂时无法对此进行正确的研究,但是UI Automation可能该复选框可能支持IInvokeProvider,您可以使用{ {3}}方法?

答案 4 :(得分:0)

我认为你不能以这种方式生成点击事件而不直接调用checkBox_Click事件处理程序。但你可以这样做:

checkBox.Checked = !checkBox.Checked;

即使你这样做,仍然会调用CheckedChanged处理程序。

答案 5 :(得分:0)

您没有指定哪种CheckBox控件。 ASP.net还是Windows?

假设有一个web复选框控件,这是使用代码隐藏中的JavaScript调用来解决它...

从后面的代码调用JavaScript函数

第1步添加您的Javascript代码

<script type="text/javascript" language="javascript">
    function Func() {
        alert("hello!")
    }
</script>

步骤2在webForm中添加1个脚本管理器并添加1个按钮

步骤3在按钮点击事件中添加此代码

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", "Func()", true);

答案 6 :(得分:0)

Button PerformClick() 方法验证活动控件,测试活动控件是否可以失去当前焦点。有两种方法可以对 CheckBox 执行相同的操作。方法 #1 是使用反射将 internal 的方法调用到 Control 类:

public class CheckBoxPerformClick : CheckBox {

    private readonly static MethodInfo callValidateActiveControl;
    private readonly static PropertyInfo propValidationCancelled;

    static CheckBoxPerformClick() {
        try {       
            Type ty = typeof(Control);
            Type outBool = Type.GetType("System.Boolean&");
            callValidateActiveControl = ty.GetMethod("ValidateActiveControl", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { outBool }, null);
            propValidationCancelled = ty.GetProperty("ValidationCancelled", BindingFlags.Instance | BindingFlags.NonPublic);
        } catch {}  
    }

    public CheckBoxPerformClick() : base() {
        this.Text = "Checkbox";
        this.Appearance = Appearance.Button;
    }

    public void PerformClick() {
        if (callValidateActiveControl != null && propValidationCancelled != null) {
            try {
                Object[] args = new Object[1];
                bool validate = (bool) callValidateActiveControl.Invoke(this, args);
                bool validatedControlAllowsFocusChange = (bool) args[0];
                if (validate || validatedControlAllowsFocusChange) {
                    bool cancelled = (bool) propValidationCancelled.GetValue(this);
                    if (!cancelled) {
                        ResetFlagsandPaint();
                        OnClick(EventArgs.Empty);
                    }
                }
            } catch {
            }
        }
    }
}

方法#2 尝试做同样的事情,但没有反思:

public class CheckBoxPerformClick2 : CheckBox {

    public CheckBoxPerformClick2() : base() {
        this.Text = "Checkbox";
        this.Appearance = Appearance.Button;
    }

    public void PerformClick() {
        bool validate = CanPerformClick();
        if (validate) {
            ResetFlagsandPaint();
            OnClick(EventArgs.Empty);
        }
    }

    // before allowing a click, make sure this control can receive the focus, and that other controls don't require validation
    public bool CanPerformClick() { 
        if (!CanSelect)
            return false;

        Control c = this.Parent;
        while (c != null) {
            if (c is ContainerControl)
                break;
            c = c.Parent;
        }

        bool valid = true;
        if (c is ContainerControl) {
            var cc = (ContainerControl) c;
            valid = cc.Validate(true);
        }
        return valid;
    }
}