如何正确更改C#中RadioButton组当前选中的RadioButton

如何正确更改C#中RadioButton组当前选中的RadioButton,c#,.net,winforms,radio-button,C#,.net,Winforms,Radio Button,我有一个GroupBox,里面有一堆单选按钮。当它们有焦点时,我可以使用上/下键对它们进行迭代 但当我手动更改checkedRadioButton并按下up/down时,迭代从更改checkedRadioButton之前的点开始。问题是: 当RadioButton具有焦点时,处理事件的控件对应于向上/向下键单击 回答: 要处理TAB、ESC、RETURN或ARROW按钮的事件,需要覆盖控件的方法。或者覆盖ProcessCmdKey而不是KeyDown 如何正确更改当前选中的单选按钮 回答

我有一个
GroupBox
,里面有一堆
单选按钮。当它们有焦点时,我可以使用上/下键对它们进行迭代

但当我手动更改checked
RadioButton
并按下up/down时,迭代从更改checked
RadioButton
之前的点开始。问题是:

  • 当RadioButton具有焦点时,处理事件的控件对应于向上/向下键单击
回答: 要处理TAB、ESC、RETURN或ARROW按钮的事件,需要覆盖控件的方法。或者覆盖
ProcessCmdKey
而不是
KeyDown

  • 如何正确更改当前选中的单选按钮
回答: 除了设置radioButton.Checked=true
。您需要对其设置焦点-
radioButton.focus()

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

  • 当前选中的是1号单选按钮
  • 我的功能更改已检查 从1号到3号的单选按钮
  • 用户向上和向下按箭头 0号单选按钮变为选中状态,而不是2号单选按钮
  • 什么事件对应于向上/向下键单击
    单选按钮

    没有事件对应于单个
    单选按钮
    s,您可以在不释放的情况下按键,但仍可以处理按键命令。但是,您可以重写表单从
    表单继承的
    ProcessCmdKey
    方法:

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

    TabIndex
    属性没有个人
    单选按钮的内部索引。但是,由于您将它们放在
    组框
    上,该组框是
    控件
    ,并且具有名为
    控件
    的继承属性,因此它是其子控件的集合

  • 示例中出现的问题是
    TabIndex
    的问题


    控件
    是WinForm应用程序大多数可视组件的基类。它有一个父/子层次结构,您放在
    GroupBox
    上的所有
    RadioButton
    都有相同的父对象,
    GroupBox
    本身拥有这些
    RadioButton
    并具有属性
    控件,您可以通过索引访问它们

    您可以按如下方式获取所选单选按钮:

    RadioButton checkedButton = Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked);
    
    RadioButton checkedButton=Controls.OfType().FirstOrDefault(r=>r.Checked);
    
    您可以将checkChanged事件添加到所有单选按钮

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

    int index = groupBox1.Controls.IndexOf(groupBox1.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked));
    
    int index=groupBox1.Controls.IndexOf(groupBox1.Controls.OfType().FirstOrDefault(r=>r.Checked));
    
    这将选择一个特定的索引:

    groupBox1.Controls.OfType<RadioButton>().ElementAtOrDefault(index).Select();
    
    groupBox1.Controls.OfType().ElementAtOrDefault(index.Select();
    
    好的,当用户按下向上/向下按钮时,他/她只是在单选按钮之间移动焦点。因此,您只需调用按钮的方法
    Focus()
    ,您刚刚将checked属性设置为
    true

    尝试将当前选项卡索引设置为所选项目问题不在于选中RadioButton,而是将其正确更改为另一个。我想我不理解这个问题。是否要根据当前选定的单选按钮选择单选按钮?我在第一篇文章中添加了一个问题示例。1)TabIndex保留组中控件的索引,但我需要当前选中的单选按钮的内部索引。2) KeyPress和KeyDown不处理按向上/向下箭头的事件。KeyUp事件仅在按钮处于打开状态时发生,但您可以单击按钮以滚动单选按钮。1)问题是:什么控件处理Arrow_up KeyDown事件。如果没有这样的控件,那么为什么当前选择的radiobutton会更改2)如果没有内部索引,那么为什么会出现这样的问题(参见示例)?ProcessCmdKey实际上捕捉到了向上按箭头的动作,这解决了我的问题。但我相信有更好的方法来解决这个问题,我想知道这个问题的根源是什么。剩下的问题是:为了处理向上按箭头键的操作,我应该设置哪个控件的KeyDown事件。@SkyterX:如果你想长时间按住任何键都能更好地处理任何键,最好的选择是重写表单的
    ProcessCmdKey
    keyData
    可以指示按下了哪个键,而不管是向上/向下键还是其他键。但是为什么MainForm.KeyDown事件不能处理它呢?