Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何才能在C#中取消选中单选按钮,同时仍然只允许第一个单选按钮是可选项卡的?_C#_Tabs_Radio Button_Tabstop - Fatal编程技术网

我如何才能在C#中取消选中单选按钮,同时仍然只允许第一个单选按钮是可选项卡的?

我如何才能在C#中取消选中单选按钮,同时仍然只允许第一个单选按钮是可选项卡的?,c#,tabs,radio-button,tabstop,C#,Tabs,Radio Button,Tabstop,不确定标题是否有意义,以下是完整的上下文: 我正在用C#编码。 我制作了一个有几个用户控件的应用程序,每个都有许多文本框和单选按钮。 所有单选按钮以2个为一组放置在面板中,如下所示: [O] (第一个单选按钮的TabStop=true,第二个单选按钮的TabStop=false) 当切换到该面板时,只有radiobutton1text被聚焦,当点击LeftArrow键时,radiobutton1text被选中。这是理想的结果 为了使UserControl在第二次(及以上)加载时更快,我不会关闭它

不确定标题是否有意义,以下是完整的上下文:

我正在用C#编码。 我制作了一个有几个用户控件的应用程序,每个都有许多文本框和单选按钮。 所有单选按钮以2个为一组放置在面板中,如下所示:

[O]

(第一个单选按钮的TabStop=true,第二个单选按钮的TabStop=false)

当切换到该面板时,只有radiobutton1text被聚焦,当点击LeftArrow键时,radiobutton1text被选中。这是理想的结果

为了使UserControl在第二次(及以上)加载时更快,我不会关闭它,而是在每次内容需要更改时用不同的UserControl替换它。 但这就产生了一个问题:当UserControl X打开时,我在上面打开UserControl Y,然后返回到X,文本框和单选按钮仍然包含我第一次打开UserControl X时的第一个会话的内容。(我需要在更换用户控件后重置文本框和单选按钮的内容)

所以我做了一个函数,它循环遍历所有控件并清空它们的内容。 问题是,当我在该函数中取消选中单选按钮(并将其TabStop状态恢复为true)时,在我选中其中一个单选按钮后,第二个单选按钮是可选项卡的,然后调用该函数,而在执行该函数之前,它不是

职能:

public void BackToMain(对象发送方,事件参数e)
{
//检查所有控件并清空每个文本框、RichTextBox、RadioButton或ComboBox。
int parentcontrolscont=Controls.Count-1;
对于(int i=parentcontrolscont;i>=0;i--)
{
if(Controls[i].HasChildren==true)
{
int childrencontrolscont=Controls[i].Controls.Count-1;
对于(int j=childrencontrolscont;j>=0;j--)
{
var controlType=Controls[i].Controls[j].GetType().ToString();
开关(控制型)
{
案例“System.Windows.Forms.TextBox”:
案例“System.Windows.Forms.RichTextBox”:
控件[i]。控件[j]。Text=null;
打破
案例“System.Windows.Forms.RadioButton”:
//将这两个属性恢复为默认值
((RadioButton)控件[i]。控件[j])。选中=false;
如果(j==1)
((RadioButton)控件[i]。控件[j])。TabStop=true;
else如果(j==2)
((RadioButton)控件[i]。控件[j])。TabStop=false;
打破
案例“System.Windows.Forms.ComboBox”:
((组合框)控件[i]。控件[j])。选择的索引=-1;
打破
}
}
}
}
}

我做错了什么?

我最后应用了这个粗俗的黑客——一个每秒钟对radiobutton的CheckedChange执行一次的功能:

private void DisableTabStopOnCheckedChange(对象发送方,事件参数e)
{
//假设以下情况:
//1.在任何radiobutton面板中,选择任何radiobutton(无需在第一篇文章中调用BackToMain函数);
//2.调用BackToMain函数;
//3.在与步骤#1相同的单选按钮面板中,单击第二个单选按钮。
//通常,如果没有此功能,用户现在将使用Tab键在控件之间循环,则第一个和第二个单选按钮都将是可选项卡的,
//这是因为在BackToMain函数中,我们重置了它们的Checked和TabStop属性,这应该由控件本身自动处理。
//手动操作意味着*第一次*选择第二个单选按钮时,第一个单选按钮的TabStop状态不会更新,这意味着两个单选按钮都不会更新
//将TabStop状态设置为true,从而使两者都可选项卡化。
//如果第二个单选按钮被选中,并且第一个单选按钮的TabStop状态为空,那么通过禁用第一个单选按钮上的TabStop来解决这个问题,这是一个严重的黑客攻击
//为true(只有在调用BackToMain后才会发生此情况)。
如果(((单选按钮)发送器)。选中)
{
var firstRadioButton=((RadioButton)sender.Parent.Controls[1];
if(((RadioButton)firstRadioButton).TabStop==true)
{
((RadioButton)firstRadioButton).TabStop=false;
}
}
}

我知道这不是个好办法。但它是有效的。

我最终应用了这个粗俗的破解——每秒钟一次单选按钮的CheckedChange上的一个函数:

private void DisableTabStopOnCheckedChange(对象发送方,事件参数e)
{
//假设以下情况:
//1.在任何radiobutton面板中,选择任何radiobutton(无需在第一篇文章中调用BackToMain函数);
//2.调用BackToMain函数;
//3.在与步骤#1相同的单选按钮面板中,单击第二个单选按钮。
//通常,如果没有此功能,用户现在将使用Tab键在控件之间循环,则第一个和第二个单选按钮都将是可选项卡的,
//这是因为在BackToMain函数中,我们重置了它们的Checked和TabStop属性,这是应该自动处理的