【问题标题】:Detecting change source (user or program) in radio buttons检测单选按钮中的更改源(用户或程序)
【发布时间】:2018-05-29 20:04:25
【问题描述】:

我正在尝试设置一个标志,说明 Checked 属性的最后一次更改是由用户还是程序引起的。

我正在使用自定义RadioButton:

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 更改值时,Click 事件会调用 OnButtonClickedByUser。

我的问题是CheckedChanged 事件在Click 事件之前触发,这使得OnCheckChange 不可靠。

有什么办法可以解决吗?

【问题讨论】:

    标签: c# .net winforms radio-button


    【解决方案1】:

    用户可以通过单击控件或将焦点移动到控件(箭头键、制表符、助记键组合)来更改RadioButton 的值。

    OnEnter 和ProcessMnemonic 都尝试调用PerformClick,后者调用负责检查控件的OnClick。所以你可以覆盖OnClick方法:

    protected override void OnClick(EventArgs e) 
    {
        // Here CheckedChanged event has not been raised yet
    
        base.OnClick(e);
    }
    

    要详细了解RadioButton 在内部的工作方式,请查看其source code。

    【讨论】:

    • 对我来说这似乎是一个XY Problem。无论如何,我分享了答案,您可能会发现它很有用。
    • XY 问题部分很有趣,而且绝对相关。除了修复我尝试的解决方案之外,我应该询问其他方法。
    • 当前格式的问题已经足够好了。通过谈到 XY 问题,我只是分享了我对 X 的猜测和好奇。如果您出于任何原因想询问有关 X 的问题,最好在另一个线程中提问 :)
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2023-04-03
    • 2016-01-22
    • 2021-10-20
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多