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