繁体   English   中英

CheckedChanged事件中的问题

[英]Issue in CheckedChanged event

我有一个复选框,并且已经订阅了CheckedChanged事件。 处理程序在其中执行一些操作。 我以编程方式选中和取消选中该复选框(例如: chkbx_Name.Checked = true ),并触发了CheckedChanged事件。

我希望仅在手动选中或取消选中它时才触发此事件。 当我以编程方式选中/取消选中该事件时,有什么方法可以避免触发此事件?

取消订阅活动之前,请先进行以下设置:

check1.CheckChanged -= check1_CheckChanged;

那么您可以通过编程方式设置该值,而无需复选框触发其CheckChanged事件:

check1.Checked = true;

然后重新订阅:

check1.CheckChanged += check1_CheckChanged;

[编辑:2012年3月29日]

Tanvi方法的问题是您需要捕获所有手动检查或取消检查的来源。 并不是有太多(仅来自于鼠标单击和用户按下空格键),但是您必须考虑从MouseClick和KeyUp调用重构事件(检测空格键)

CheckBox(与此相关的任何控件)与用户输入(键盘,鼠标等)的来源无关,因此更为简洁,因此,我将使CheckBox的编程设置真正具有编程性。 例如,您可以将属性的编程设置包装到扩展方法中:

static class Helper
{
    public static void SetCheckProgrammatically(
        this CheckBox c, 
        EventHandler subscribedEvent, bool b)
    {            
        c.CheckedChanged -= subscribedEvent; // unsubscribe
        c.Checked = b;
        c.CheckedChanged += subscribedEvent; // subscribe
    }
}

使用这种方法,您的代码仅可以通过一个事件(即通过CheckChanged)对用户的鼠标输入和键盘输入做出巧妙的响应。 无需重复代码,无需预订多个事件(例如,键盘,通过按空格键选中/取消选中CheckBox)

不会。只要属性值发生更改,这些属性更改事件就会触发,而不管这是由代码,由控件自己的代码还是由数据绑定完成的。 通常,它们都是相同的代码路径。

但是,如果事件处理程序与更改属性值的代码位于同一类中,那么您可以做的是在该类中引入一个私有布尔字段,您可以将其用作指示当前属性更改是否由以下属性触发的指标您的代码或由用户。 更改后,您只需重置它即可。 然后,事件处理程序将查看该字段并决定是否应该执行任何操作:

class Foo : Form {
    private bool checkedProgrammatically = false;

    void someMethod() {
        // ...
        checkedProgrammatically = true;
        checkBox1.Checked = true;
        checkedProgrammatically = false;
        // ...
    }

    private void checkBox1_CheckChanged(object sender, EventArgs e) {
        if (checkedProgrammatically) return;
        // ...
    }
}

抱歉,由于我是新来的(没有声誉),我不能只评论Michael Buen的回答,但是出于几个原因,我非常希望他的解决方案比JohannesRössel的解决方案好。

1)checkedProgrammatically变量对我来说有点接近全局变量。 没有什么可以阻止另一种方法意外将其设置为true,从而导致所有事件停止。

2)根据要处理的事件数,最终可能会有很多变量。 更改错误的代码很容易,结果也很难调试。

3)当您取消订阅然后重新订阅时,您正在做什么。 所有逻辑就在那里,您无需更改事件处理程序即可根据特定条件提早退出。

我已经广泛使用了这两种方法,从长远来看,我发现Michael的使用要容易得多。

您可以使用MouseClick事件,并在其中检查复选框的已选中状态。 这样,就不会以编程方式触发它,只有在用户手动选中或取消选中复选框时才会调用它。

您可以在以编程方式更改值之前设置布尔变量,并在checkedchanged事件中检查并重置该变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM