在Radio Box中设置Checked属性时,是否可以取消CheckedChanged事件?

时间:2010-09-17 01:37:48

标签: c# .net winforms

我是C#和Windows Form的新手,但是如果我有一个radiobutton并且我调用radiobutton1.Checked = true,有没有办法让它不会触发CheckedChange事件?我想区分用户点击radiobutton和我以编程方式设置radiobutton。这可能吗?

6 个答案:

答案 0 :(得分:6)

不要试图打败CheckedChanged事件的设计。它特别应该包括程序化的变化。

如果您想要用户触发的更改而不是程序化更改,请改用Click事件。 (您可能认为自己不想限制鼠标点击,不要担心,有MouseClick事件,Click也包括键盘更改。)

答案 1 :(得分:2)

这是一种直接使用该事件的方法。

private bool SuppressRadioButton1Event { get; set; }

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (!this.SuppressRadioButton1Event)
    {
        MessageBox.Show("Not suppressed!");
    }
}

private void button1_Click(object sender, EventArgs e)
{
    this.SetRadioButton1(false);
}

private void SetRadioButton1(bool checkedOn)
{
    this.SuppressRadioButton1Event = true;
    radioButton1.Checked = checkedOn;
    this.SuppressRadioButton1Event = false;
}

答案 2 :(得分:2)

一种非常简单的方法:

public void radio_OnCheckChanged(object sender, EventArgs e)
{
   RadioButton r = sender as RadioButton;
   bool isUserChange = r.Tag.Equals(1);
   if (isUserChange) blabla
   else blabla
   r.Tag = null;       
}

public void MyMethod()
{
   radio1.Tag = 1;
   radio.Checked = true;
}

您可以使用任何类型的flag用户点击时无法执行的操作。但您可以通过代码执行此操作。

答案 3 :(得分:1)

为什么您的代码会关心谁检查了radiobutton?

编辑:有很多方法(子类,标志),但。我想到的唯一“合法”理由是想要防止在最初(以编程方式)显示值时发生某些副作用,甚至可疑。重新考虑副作用,它真的属于变更事件还是提交?

更多信息一个为什么/什么会有所帮助。从表面上看,这看起来像是一个设计错误。

答案 4 :(得分:0)

执行此操作的一种(hackish)方法是子类RadioButton并覆盖OnCheckChanged虚方法,如果已以编程方式设置Checked属性,则禁止该事件。

但是,由于单选按钮属于一个组,因此该事件总是成对触发(取消选中,一个用于检查)。因此,当您以编程方式选择所选按钮时,您将要禁止整个组的事件。这是一个示例实现:

public class CustomRadioButton : RadioButton
{
    private bool _suppressCheckedEvent;

    public void SetChecked(bool value, bool suppressCheckedEvent)
    {
        if (!suppressCheckedEvent)
            Checked = value;
        else
        {
            SetSupressModeForGroup(true);
            Checked = value;
            SetSupressModeForGroup(false);
        }
    }

    private void SetSupressModeForGroup(bool suppressCheckedEvent)
    {
        foreach (var crb in Parent.Controls.OfType<CustomRadioButton>())
            crb._suppressCheckedEvent = suppressCheckedEvent;
    }

    protected override void OnCheckedChanged(EventArgs e)
    {
        if (!_suppressCheckedEvent)
            base.OnCheckedChanged(e);
    }   
}

在此实现中,通过Checked属性更改checked-state将始终触发事件。当您调用SetChecked方法时,您可以选择禁止该事件。

答案 5 :(得分:-1)

您可以尝试以编程方式附加事件。根据我的应用程序配置,我检查几个单选按钮,但我不想触发事件。 以编程方式附加事件:

chbOptionX.CheckedChanged + = new System.EventHandler(this.chbShowStockBySizeAndColor_CheckedChanged);