2017-07-18 49 views
0

我有一个窗体,在窗体上放置了2个单选按钮。我的问题是我需要它的功能,如果点击一个,另一个将被取消点击。我有下面的代码,但是一旦你做了第一次点击,它就会陷入inifinite循环中,我明白为什么。想看看你们中的任何人是否知道如何在c#中做这件事?我相当新的C#C#VS - 当选中一个单选按钮时,取消选中另一个单选按钮

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     radAllCols.CheckedChanged += new EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged += new EventHandler(this.radSelCols_Checked); 
    } 

    private void radAllCols_Checked(object sender, EventArgs e) 
    { 
     if (radAllCols.Checked == true) 
     { 
      radAllCols.Checked = false; 
      radSelCols.Checked = true; 
     } 
    } 

    private void radSelCols_Checked(object sender, EventArgs e) 
    { 
     if (radSelCols.Checked == true) 
     { 
      radSelCols.Checked = false; 
      radAllCols.Checked = true; 
     } 
    } 
} 
+9

单选按钮放置在同一个父控件(如面板)默认情况下表现为这种方式。 – user6144226

+1

您需要将单选按钮放在容器(如组框或面板)中。 –

+0

您可以将这两个单选按钮放在面板或组框中,然后您不需要绑定任何事件,并且一次只选择其中一个。你可以得到使用Checked Property检查的单选按钮。 –

回答

2

如果单选按钮有不同RadioGroup值必须首先取消注册Checked事件,更改Checked属性值并重新注册Checked事件。

private void radAllCols_Checked(object sender, EventArgs e) 
{ 
    if (radAllCols.Checked == true) 
    { 
     radAllCols.CheckedChanged -= new 
       EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged -= new 
       EventHandler(this.radSelCols_Checked); 
     radAllCols.Checked = false; 
     radSelCols.Checked = true; 
     radAllCols.CheckedChanged += new 
       EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged += new 
       EventHandler(this.radSelCols_Checked); 
    } 
} 

private void radSelCols_Checked(object sender, EventArgs e) 
{ 
    if (radSelCols.Checked == true) 
    { 
     radAllCols.CheckedChanged -= new 
       EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged -= new 
       EventHandler(this.radSelCols_Checked); 
     radSelCols.Checked = false; 
     radAllCols.Checked = true; 
     radAllCols.CheckedChanged += new 
       EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged += new 
       EventHandler(this.radSelCols_Checked); 
    } 
} 

上面的代码适用于非常自定义的场景,应该尽可能避免。无线电盒应该按照你想要的方式自动运行。确保你在他们两个上都有相同的RadioGroup属性值。

+0

这个问题,是我运行表单,并舔其中一个单选按钮,另一个被选中,然后无论我做什么我都不能选择其他。就好像它锁定了它? – SBozhko

+0

没关系,我想这是因为我没有删除我在'Form 1'中的'EventHandler'。似乎现在工作正常! – SBozhko

0

放置在相同的父控制(如面板)RadioButtons默认情况下的行为。

这里没有必要使用checked事件。

设置radAllCols.Checked = true属性的值将触发radAllCols_Checked事件这会导致你的无限“循环”

既然你正试图取消同单选按钮来检查

private void radSelCols_Checked(object sender, EventArgs e) 
{ 
    if (radSelCols.Checked == true) 
    { 
     radSelCols.Checked = false; // reversed 
     radAllCols.Checked = true; // reversed 
    } 
} 
+0

是的,我得到了无限循环部分,试图找出如何克服这个问题,以便它只发生在使用检查/取消选中其中一个框时? – SBozhko

+0

@ user6144226我在这里错过了什么吗? “单选按钮”本身就是形式。是否需要“CheckChanged”事件?他们不会做预期的行为没有这个 –

+1

@SBozhko你可以在'public Form1() {}'你应该得到你正在寻找的行 –

1

如果使用分组框中容器元素为您要选择其中一个相同的单选按钮,你不`吨需要处理的手动检查单选按钮的状态,当你选择一个单选按钮所有其他的单选按钮在同一组中将被取消选中。

0

你的代码的其余部分是好的,但你需要如下文所述,以防止无限循环改变你的代码经过()的方法,然后将正常工作:

private void radAllCols_Checked(object sender, EventArgs e) 
{ 
    radAllCols.Checked = !radSelCols.Checked; 
} 

private void radSelCols_Checked(object sender, EventArgs e) 
{ 
    radSelCols.Checked = !radAllCols.Checked; 
} 
相关问题