【问题标题】:How to select one Button at a time in a Button Group in .NET Winforms如何在 .NET Winforms 的按钮组中一次选择一个按钮
【发布时间】:2020-02-29 04:30:30
【问题描述】:

我创建了一个自定义 button control,并希望它在组中表现得像 RadioButtons。该按钮将被放置在同一个containerpanel 上的同一类型的组或集合中(按钮拖放到容器上)。当我单击这些按钮中的任何一个时,我需要发生以下情况:

  1. 将点击按钮的BackColor更改为预定义颜色:Color.Cycan;

  2. 将点击按钮的选中状态从false设置为true

  3. 确保同一面板/容器上所有其他相同类型的按钮都设置为其默认设置,即: BackColor = Color.Gray; checked = false;

我尝试了以下code,但我得到了这个结果:

  1. 点击按钮的BackColor成功更改为Color.Cycan;

  2. 同一容器上所有其他同类型按钮的默认BackColor已成功设置为默认:Color.Gray;

  3. 但是点击按钮的checked state并没有变成true.,它仍然是false.

我已附上我尝试过的代码,如下:

可能是什么问题或我在哪里漏掉了重点?

这是一个Winform / Windows Forms 按钮控件,我正在C#. 中编程

我不想为此使用单选按钮,因为我已经自定义设计了MyButton

谢谢。

这是我尝试过的代码:

// 调用 'ClickedButton();'点击事件。

private bool checked = false;
private void ClickedButton()
{

do(

BackColor = Color.Cycan;
checked = true;

if(Parent == null)
break;

foreach(MyButton button in Parent.Controls.OfType<MyButton>())
{

if(button == this) { continue }

else{

BackColor = Color.Gray;
checked = false;
}
}

)
while(false)
}

【问题讨论】:

  • 检查变量在哪里定义?
  • 与函数在同一个类中定义。我已经编辑了代码以反映这一点。我的代码格式错误,因此 StackOverflow 无法显示该变量。我已经对其进行了编辑以反映变量。
  • 见代码here。它使用Action()s 定义了一些相互关联的控件的行为。
  • do...while在这里的作用是什么?没有意义。 foreach...next 就足够了,可以完成这项工作。删除do..while 块并尝试一下。
  • @JQSOFT:删除do..while 循环并不能解决问题。我希望将单击按钮的选中状态设置为true,并将所有其他按钮的选中状态设置为false。确保在您的回复中包含经过测试的代码,我可能在这里遗漏了一些东西。我求助于使用do while loop 来尝试更改按钮的boolean 状态。

标签: c# winforms button boolean do-while


【解决方案1】:

用这个方法怎么样?

private bool isSelected = false;

private Color activeColor = Color.FromArgb(117, 117, 117);
private Color defaultColor = Color.FromArgb(66, 66, 66);

private void ClickedButton()
{
    foreach (Control parentControl in Parent.Controls)
    {
        if (parentControl is MyButton parentButton)
        {
            parentButton.isSelected = false;
            parentButton.BackColor = parentButton.isSelected ? parentButton.activeColor : parentButton.defaultColor;
        }
    }

    this.isSelected = true;
    this.BackColor = isSelected ? activeColor : defaultColor;
}

它是这样工作的。

【讨论】:

  • 感谢您的解决方案。它不仅可以工作,而且代码比在do...while 循环中迭代更干净、更快捷。我测试了您的解决方案,它产生了预期的结果。
猜你喜欢
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2013-07-20
相关资源
最近更新 更多