我有许多不同的标签,在标签中我有一些单选按钮。我只想在标签页中一次选择一个单选按钮。我有以下代码
private void RadioButtonCheckedChanged(object sender, EventArgs e)
{
TabControl.TabPageCollection pages = tabControl1.TabPages;
var rdoButtonName = sender as RadioButton;
foreach (TabPage page in pages)
{
foreach (Control item in page.Controls)
{
if (item is RadioButton)
{
if (rdoButtonName.Name == item.Name)
{
rdoButtonName.Checked = true;
}
else
{
rdoButtonName.Checked = false;
}
}
}
}
}
当我点击第一个标签页上的单选按钮时,它不允许我更改其检查状态,但它会在其他页面上更改。任何人都可以看到上述代码有什么问题吗?
答案 0 :(得分:0)
我看到您将Checked值设置为发件人,而不是其他单选按钮......
private void RadioButtonCheckedChanged(object sender, EventArgs e)
{
TabControl.TabPageCollection pages = tabControl1.TabPages;
var rdoButtonName = sender as RadioButton;
foreach (TabPage page in pages)
{
foreach (Control item in page.Controls)
{
if (item is RadioButton)
{
if (item.Name != rdoButtonName.Name)
{
item.Checked = false;
}
}
}
}
}
答案 1 :(得分:0)
我认为(更好的调试和检查)你的问题是每次你改变一个RadioButton状态时它会再次调用这个函数并产生意想不到的结果。
要解决此问题,我会在更改Checked
状态之前分离并重新连接事件处理程序,如下所示:
private void RadioButtonCheckedChanged(object sender, EventArgs e)
{
TabControl.TabPageCollection pages = tabControl1.TabPages;
var rdoButtonName = sender as RadioButton;
foreach (TabPage page in pages)
{
foreach (Control item in page.Controls)
{
if (item is RadioButton)
{
rdoButtonName.CheckedChanged -= new System.EventHandler(this.RadioButtonCheckedChanged);
if (rdoButtonName.Name == item.Name)
{
rdoButtonName.Checked = true;
}
else
{
rdoButtonName.Checked = false;
}
rdoButtonName.CheckedChanged += new System.EventHandler(this.RadioButtonCheckedChanged);
}
}
}
}
答案 2 :(得分:0)
问题是,“CheckedChanged” -event不能在这种情况下使用,这就是问题所在。关键是要使用另一个事件 - “点击”:
private void radioButton_Click(object sender, EventArgs e)
{
foreach (TabPage page in tabControl1.TabPages)
{
foreach (RadioButton radioButton in page.Controls)
{
if (radioButton != (RadioButton)sender) { radioButton.Checked = false; }
}
}
}
更改您的RadioButtons以在“Click” -event中使用此方法,它将起作用。我亲自测试过。