如何正确更改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
,里面有一堆单选按钮。当它们有焦点时,我可以使用上/下键对它们进行迭代
但当我手动更改checkedRadioButton
并按下up/down时,迭代从更改checkedRadioButton
之前的点开始。问题是:
- 当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事件不能处理它呢?