如何确定是否以编程方式或通过鼠标单击设置单选按钮Button.Checked?

时间:2008-10-25 22:46:39

标签: .net winforms

我的Windows窗体上有一个单选按钮。如何确定是否由于用户单击或选择单选按钮而发生CheckChanged事件vs使用

以编程方式设置事件
this.radioButtonAdd.Checked = true;

我希望一些代码可以采取不同的操作,具体取决于用户是否点击了按钮,或者我自己举办了活动。

或许更好的问题是,当用户点击时,如何在代码中更改状态时如何处理事件。

3 个答案:

答案 0 :(得分:2)

如果有内置方法,那我就不知道了。

处理它的一种方法是在代码进行更改时设置一个全局标志,告诉事件处理程序。例如,进行更改的代码可能如下所示:

savedFlag = modifyingProgrammatically;
modifyingProgrammatically = true;
this.radioButtonAdd.Checked = true;
modifingProgrammatically = savedFlag;

在您的事件处理程序中:

if(modifyingProgramatically) {
    // The event was raised by an assignment within the code.
} else {
    // The event was raised by a user action.
}

答案 1 :(得分:2)

我想我找到了一个很好的答案。

所有Windows窗体控件都有一个名为“Tag”的属性。它的价值可以是任何对象。

因此,如果我想要进行任何编程更改,我可以执行以下操作:

radioButton.Tag = "ignore"
radioButton.Checked = true

然后在事件处理程序中:

private void radioButton_CheckedChanged(object sender, EventArgs e)
{
    if (radioButton.Checked)
    {
        // Tag will be null in cases where the user clicks
        if (this.radioButtonAdd.Tag == null)
        {
            // do something
        }
        else
        { 
            // swallow action
            // reset Tag
            this.radioButtonAdd.Tag = null;
        }
    }
}

答案 2 :(得分:1)

您还可以执行类似操作,例如在MouseDown上更改单选按钮上的标志字段值,然后在MouseClick上恢复标记值。由于CheckedChanged事件在两者之间触发,因此它可以在MouseClick事件恢复之前使用该标志,并且您不必担心重置其状态。

如果您使用字段作为标记(对您正在处理的应用程序了解不多),您可能仍然需要解决线程问题,但是这样的事情应该有效:

    private bool _mouseEvent;
    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        if (_mouseEvent)
            MessageBox.Show("Changed by mouse click.");
        else
            MessageBox.Show("Changed from code.");
    }

    private void radioButton1_MouseClick(object sender, MouseEventArgs e)
    {
        _mouseEvent = false;
    }

    private void radioButton1_MouseDown(object sender, MouseEventArgs e)
    {
        _mouseEvent = true;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // This simulates a change from code vs. a change from
        // a mouse click.
        if (radioButton1.Checked)
            radioButton2.Checked = true;
        else
            radioButton1.Checked = true;
    }

或者,您可以将“鼠标单击”应用程序逻辑分开,以便由不同的事件(如MouseClick)触发。

希望这有帮助。

相关问题