3

当(Windows 窗体)复选框未选中(但未选中)时,是否有任何方法或是否可以编写方法来执行一组指令?我将提供我的示例代码来澄清这一点。

现有示例代码:

private void ChkBox_CheckedChanged(object sender, EventArgs e)
{
    if (ChkBox.Checked == false)
        {
                MessageBox.Show("unchecked");
        }
}

问:是否if condition可以通过为此编写一个仅在未选中复选框时才执行的方法来避免这种情况。

插图: 像这样的东西:

private void ChkBox_Unchecked(object sender, EventArgs e)
{
    MessageBox.Show("unchecked");
}

附加评论:对于事件“复选框已选中”,我没有任何要执行的操作。所以只是想我是否可以checkchanged通过将事件替换unchecked为事件类型来避免事件。

4

7 回答 7

5

如果你真的需要那些奇怪的事件,那么通过从 CheckBox 继承来创建自定义复选框。覆盖它的OnCheckedChanged事件,并添加您的Unchecked事件:

public class StrageCheckBox : CheckBox
{
    public event EventHandler Unchecked;

    protected override void OnCheckedChanged(EventArgs e)
    {
        base.OnCheckedChanged(e);

        if (!Checked)
            OnUnchecked(e);
    }

    protected virtual void OnUnchecked(EventArgs e)
    {
        if (Unchecked != null)
            Unchecked(this, e);
    }
}

使用StrangeCheckBoxes而不是默认复选框。订阅Unchecked事件。瞧,你有那种奇怪的行为。

备注实际上,我不建议在所有情况下都使用自定义控件或 if/else。如果您有许多具有这种行为的复选框,那么自定义控件比每个处理程序中的许多重复 if/else 更好。如果您有多个控件或所有复选框的单个处理程序,那么我会使用 if/else 方法。

于 2013-03-04T11:42:48.540 回答
2

你可以继承CheckBoxoverride OnCheckedChanged

class ExtendedCheckBox : CheckBox
{
    public event EventHandler Unchecked;
    protected override void OnCheckedChanged(EventArgs e)
    {
        base.OnCheckedChanged(e);

        if (Checked == false)
            OnUnchecked(e);            
    }
}
于 2013-03-04T11:40:52.727 回答
1

不,唯一暴露的事件是检测状态何时发生变化,然后您必须检查状态以确定它是如何变化的。

如果愿意,您可以创建自己的控件,该控件基本上包装了该控件并公开了此类可区分状态的事件,但这似乎完全没有意义。

于 2013-03-04T11:37:28.253 回答
1

不,对不起。这是您可以触发状态更改的唯一事件。你的代码看起来不错。有什么不喜欢的理由?

于 2013-03-04T11:39:19.007 回答
0

据我所知,所有更改都会触发该事件,您可以编写自己的控件来区分所选值并引发单独的事件,但不确定它是否真的值得。

于 2013-03-04T11:39:01.307 回答
0

我不认为你可以做这样的事情,但是如果你有很多指令要执行,如果复选框未被选中并且你不想将它们封装在一个if语句中,你可以checked在开始时检查并返回:

private void ChkBox_CheckedChanged(object sender, EventArgs e)
{
    if (ChkBox.Checked) return;

    MessageBox.Show("unchecked");
}
于 2013-03-04T11:40:20.870 回答
0

这将是一个简单直接的解决方案,尽管最好的建议方法是从 CheckBox 继承并修改事件。但是,一个比较简单的方法如下:

减小CheckBox宽度,使CheckBox Label不再可见。只有框应该是可见的。然后,在盒子旁边加上另一个标签,该标签应该与盒子互斥。

现在,编辑CheckBox Clicked事件。使用某种标志来识别复选框的状态。瞧!

于 2016-01-26T06:09:41.290 回答