2010-03-19 103 views
8

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

我想成为引发此事件。只有当我手动检查或取消选中它。有没有什么办法来避免触发这个事件时,我检查/取消选择编程?

回答

13

退订事件中,你之前设置:

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回应。没有重复的代码,不需要订阅多个事件(例如,键盘,按空格键检查/取消选中复选框)

+0

我喜欢这个解决方案,但是如果在一个给定的项目上有多个编码器,那么每次他们改变这个属性时,每个人都不得不取消订阅吗? – Coops 2012-01-03 17:30:09

+0

用扩展属性包装它,呃..扩展方法。例如check1.SetCheckedRaw(booleanHere) – 2012-02-07 13:21:39

5

号这些属性更改事件,火灾时的属性值的变化,无论这是由你的代码完成后,通过控制自己的代码或数据绑定。通常,它的代码路径都是相同的。

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

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; 
     // ... 
    } 
} 
0

可以programiticaly改变值之前设定布尔变量,并检查比重置变量的CheckedChanged事件

1

对不起,我不能只评论迈克尔布恩的答案,因为我在这里是新的没有声望),但是对于什么是值得的,我非常喜欢他的解决方案JohannesRössel的几个原因。

1)checkedProgrammatically变量是有点太接近全球的我。没有什么可以阻止另一种方法意外地将其设置为真,导致所有事件停止。

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

3)当您取消订阅然后重新订阅时,您所做的更明显。所有的逻辑都在那里,你不需要根据特定的条件来改变你的事件处理程序提前退出。

我已经广泛地使用了这两种方法,并且从长远来看我发现迈克尔容易得多。

1

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

+1

如果用户通过空格键选中/取消选中复选框,会发生什么?不是从鼠标?看到我建议的解决方案 – 2012-03-29 12:56:51