C# 检测单选按钮中的更改源(用户或程序)
我试图设置一个标志,说明C# 检测单选按钮中的更改源(用户或程序),c#,.net,winforms,radio-button,C#,.net,Winforms,Radio Button,我试图设置一个标志,说明Checked属性的最后一次更改是由用户还是程序引起的 我正在使用自定义的单选按钮: public class MyRadioButton : RadioButton { ValueChanger valueChanger = ValueChanger.Program; public MyRadioButton() { this.Click += OnButtonClickedByUser; this.Checke
Checked
属性的最后一次更改是由用户还是程序引起的
我正在使用自定义的单选按钮
:
public class MyRadioButton : RadioButton
{
ValueChanger valueChanger = ValueChanger.Program;
public MyRadioButton()
{
this.Click += OnButtonClickedByUser;
this.CheckedChanged += OnCheckChange;
}
public void setChecked(bool val)
{
this.valueChanger = ValueChanger.Program;
this.Checked = val;
}
void OnButtonClickedByUser(Object sender, EventArgs e)
{
this.valueChanger = ValueChanger.User;
}
void OnCheckChange(Object sender, EventArgs e)
{
// do stuff depending on 'this.valueChanger'
}
enum ValueChanger
{
User,
Program
};
}
每当值因为从串行连接收到的消息而更改时,我调用setChecked
,每当值通过UI更改时,我希望OnButtonClickedByUser
事件调用Click
我的问题是CheckedChanged
事件在单击事件之前触发,这使得OnCheckChange
不可靠
有没有办法解决这个问题?用户可以通过单击控件或将焦点移动到控件(箭头键、制表符、助记键组合)来更改单选按钮的值
OnEnter
和ProcessMnemonic
都尝试调用PerformClick
,后者调用负责检查控件的OnClick
。因此,您可以覆盖OnClick
方法:
protected override void OnClick(EventArgs e)
{
// Here CheckedChanged event has not been raised yet
base.OnClick(e);
}
要了解更多有关RadioButton
如何在内部工作的信息,请查看其。对我来说,它似乎是一个很好的解决方案。无论如何,我分享了答案,你可能会发现它很有用。XY问题部分很有趣,而且绝对相关。除了修复我尝试的解决方案之外,我还应该询问其他方法。当前格式的问题已经足够好了。通过谈论XY问题,我只是分享了我对X的猜测和好奇。如果出于任何原因,你想问关于X的问题,最好用另一个帖子提问:)