如何防止以编程方式更改RadioButton.Checked从TabOrder中删除控件?

时间:2017-11-29 15:14:19

标签: c# winforms

我在C#Winforms项目上有几个RadioButtons。 我想提供一个“清晰表格”按钮,它应该重置无线电按钮。

目前我只是将RadioButton.Checked值设置为false,看起来没问题。

rdbBlockRelease.Checked = false;
rdbRegularRelease.Checked = false;

问题是当您清除表单后开始在表单中进行制表。

在标签浏览表单之前,标签顺序按预期工作。如果你检查一个单选按钮然后清除表格,则无线电按钮似乎从标签顺序中移除。

我认为这是因为radiobuttons和Tab命令的工作原理。在单选按钮组中,如果未选中所有单选按钮,则当您选中该组时,组中具有最低taborder的单选按钮将获得焦点。

如果您选中一个单选按钮然后选择该组,则会跳过未选中的单选按钮;焦点转到选中的单选按钮。

记住这一点,我相信表单中发生的事情认为单选按钮组仍然有一个选中的单选按钮并且更改radiobutton.checked值似乎不会影响该值。因此,当用户在清除表单后尝试选中单选按钮组时,表单会显示如下内容:

“哦,好吧。把焦点放在所选的单选按钮上。哦,没有选中的单选按钮。按标签顺序将焦点放在下一个项目上。”

现在我的问题出现了。我该如何防止这种情况?清除表单后,如何让用户能够切换到单选按钮组?

我正在使用Visual Studio 2017。

2 个答案:

答案 0 :(得分:2)

他们已编写代码来实现此功能,但代码有一些错误:

使用Tab键在单选按钮组之间移动时,它会尝试选择第一个选中的单选按钮。但是当没有选中的单选按钮时,它会忽略该组。

RadioButton源代码中有一些方法,如PerformAutoUpdatesWipeTabStops,它们负责实现 Tab 键的行为。这些方法会检查AutoCheck,并且只有在AutoChecktrue的情况下才有效。

因此,如果您想要更改行为,只需将AutoCheck属性设置为false并自行处理所有单选按钮的单击事件并还原Checked属性自己。

是的,我知道乍一看似乎无关紧要!但那就是它。

private void radioButton_Click(object sender, EventArgs e)
{
    var radio = (RadioButton)sender;
    radio.Checked = !radio.Checked;
}

注意:您也可以创建自己的单选按钮,而不是上面的事件处理程序,从RadioButton派生,并将AutoCheck设置为false并覆盖{{ 1}}并设置OnClick

答案 1 :(得分:0)

虽然Reza的回答将允许您没有为单选按钮组选择默认值,但您仍应考虑使用默认值。

正如Craig W.所说,在删除他的评论之前,大多数表格都会默认选择其中一个单选按钮。通过这样做,可以防止这个问题。