【问题标题】:How to change currently checked RadioButton of RadioButton group in C# properly如何在 C# 中正确更改当前选中的 RadioButton 组的 RadioButton
【发布时间】:2013-03-18 15:06:24
【问题描述】:

我有一个GroupBox 和一堆RadioButtons。当他们有焦点时,我可以使用向上/向下键来遍历它们。

但是当我手动更改选中的RadioButton 并按下上/下键时,迭代会从更改选中的RadioButton 之前的位置开始。问题是:

  • 当 RadioButton 具有焦点时,控件处理事件对应于上/下键单击。

答案: 要处理 TAB、ESC、RETURN 或 ARROW 按钮KeyDown 的事件,您需要覆盖控件的IsInputKey 方法。或者覆盖ProcessCmdKey 而不是KeyDown

  • 如何正确更改当前选中的 RadioButton。

答案: 除了设置radioButton.Checked = true。你需要专注于它 - radioButton.Focus()

示例: 我有 6 个单选按钮(0-5)组。

  • 当前选中的是 RadioButton No.1。
  • 检查了我的功能更改 RadioButton 从 No.1 到 No.3。
  • 用户按下 Arrow_Up 并 RadioButton No.0 变为选中而不是 No.2。

【问题讨论】:

  • 尝试将当前tab-index设置为选中项

标签: c# .net winforms radio-button


【解决方案1】:
  1. RadioButton 上的上/下键点击对应什么事件?

    没有事件对应于单独的RadioButtons,您可以在不释放的情况下按下键但仍会处理键命令。但是,您可以覆盖表单从 Form 继承的 ProcessCmdKey 方法:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        Console.WriteLine("123"); 
        return false; 
    } 
    
  2. 如何访问RadioButton 组的内部索引器?

    TabIndex 属性。 没有个人RadioButtons 的内部索引。但是由于您将它们放在GroupBox 上,即Control,并且有一个名为Controls 的继承属性是它的子控件的集合。

问题由例子提出,出现TabIndex的问题。

Control 是大多数 WinForm 应用程序可视化组件的基类。它具有父/子层次结构,您放在GroupBox 上的所有RadioButtons 都具有相同的父代,GroupBox 本身拥有这些RadioButtons,并具有您可以访问的属性Controls他们按索引。

【讨论】:

  • 1) TabIndex 在组中保存控件索引,但我需要当前选中的单选按钮的内部索引。 2) KeyPress 和 KeyDown 不处理按下向上/向下箭头的事件。 KeyUp 事件仅在按钮打开时发生,但您可以 hlod 按钮滚动单选按钮。
  • 1) 问题是:什么控件处理 Arrow_Up KeyDown 事件。如果没有这样的控件,那么为什么当前选中的单选按钮会改变 2)如果没有内部索引,那么为什么会出现这样的问题(见示例)? ProcessCmdKey 实际上抓住了按 Arrow_Up,这解决了我的问题。但我相信有更好的方法来解决它,我想知道这个问题的根源是什么。
  • 剩下的问题:我应该设置哪个控制 KeyDown 事件,以便处理按下 Arrow_Up。
  • @SkyterX:如果你想通过长按来处理任何键,最好的选择是覆盖表单的ProcessCmdKeykeyData 可以指示按下哪个键,无论向上/向下或其他键。
  • 但是为什么 MainForm.KeyDown 事件处理不了呢?
【解决方案2】:

好的,当用户按下向上/向下按钮时,他/她只是将焦点移动到单选按钮上。所以你只需要调用刚刚将checked属性设置为true的按钮的方法Focus()

【讨论】:

    【解决方案3】:

    你可以像这样得到选中的单选按钮:

    RadioButton checkedButton = Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked);
    

    您可以将 checkChanged 事件添加到所有单选按钮。

    这将获得所选单选按钮的索引:

    int index = groupBox1.Controls.IndexOf(groupBox1.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked));
    

    这将选择一个特定的索引:

    groupBox1.Controls.OfType<RadioButton>().ElementAtOrDefault(index).Select();
    

    【讨论】:

    • 问题不是要检查RadioButton,而是正确更改为另一个。
    • 我不认为我理解这个问题。是否要根据当前选中的单选按钮选择单选按钮?
    • 我在第一篇文章中添加了一个问题示例。
    猜你喜欢
    • 2015-09-07
    • 2010-11-25
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多