我的Windows窗体上有一个单选按钮。如何确定是否由于用户单击或选择单选按钮而发生CheckChanged事件vs使用
以编程方式设置事件this.radioButtonAdd.Checked = true;
我希望一些代码可以采取不同的操作,具体取决于用户是否点击了按钮,或者我自己举办了活动。
或许更好的问题是,当用户点击时,如何在代码中更改状态时如何处理事件。
答案 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)触发。
希望这有帮助。