【问题标题】:If one checkbox is checked, set the other to unchecked如果选中一个复选框,则将另一个设置为未选中
【发布时间】:2014-04-17 13:03:00
【问题描述】:

我的表单上有两个复选框; chkBuriedchkAboveGround我想设置它,如果一个被选中,另一个未被选中。我该怎么做?

我已经尝试过CheckChanged 属性:

private void chkBuried_CheckedChanged(object sender, EventArgs e)
{
    chkAboveGround.Checked = false;
}
private void chkAboveGround_CheckedChanged(object sender, EventArgs e)
{
    chkBuried.Checked = false;
}

它确实有效,只是没有我希望的那么好。也就是说,当我选中chkBuried,然后选中chkAboveGround 时,两个框都变为未选中状态,然后我才能再次选中另一个。

【问题讨论】:

  • 如果单选按钮是独占的,则使用它们
  • @DeveloperGuo 在这种情况下,我想使用复选框。如果没有办法用复选框做到这一点,我会回到单选按钮

标签: c# winforms checkbox


【解决方案1】:

您所解释的行为的原因是您正在使用CheckedChanged事件,这意味着当您手动设置CheckBox的Checked属性时,该事件也被触发,导致另一个框再次做出反应.

因此,以下内容可能会对您有所帮助:

private void chkBuried_CheckedChanged(object sender, EventArgs e)
{
    if (chkBuried.Checked == true) {
        chkAboveGround.Checked = false;
    } else {
        chkAboveGround.Checked = true;
    }
}

private void chkAboveGround_CheckedChanged(object sender, EventArgs e)
{
    if (chkAboveGround.Checked == true) {
        chkBuried.Checked = false;
    } else {
        chkBuried.Checked = true;
    }
}

更新 29.03.2020:在功能上,我的答案中的代码与 Riz 给出的答案相同。尽管如此,我还是按照我最初所说的那样保留代码,因为它可能会让刚接触编码的人更容易理解整个情况。如果您要在生产代码中实现任何类似的东西,请以 Riz 的答案为例

【讨论】:

  • 我试过了,不幸的是没用,但是你的解释帮助我理解了为什么我的没用 :) 谢谢 Danek
  • @Ben,对不起,我没有完全正确地回答这个问题。 Riz的解释真的很好:)
【解决方案2】:

我需要在激活 CheckBox 时显示或不显示一个表格,它们是如何成为两个的,如果我同时激活两个,一切都很好,但是如果我稍后尝试停用一个,另一个也被停用。 PD:我使用的表的默认值是 Visible=false。我得到的解决方案如下:

 protected void YourNameOfMethodForBothCheckBox(object sender, EventArgs e)
    {
        if (CheckBox_1.Checked == true)
        {
            Table_1.Visible = true;

            if (CheckBox_2.Checked == true)
            {
                Table_2.Visible = true;
            }
            else { Table_2.Visible = false; }


        }
        else
        {
            Table_1.Visible = false;

            if (CheckBox_2.Checked == false)
            {
                Table_2.Visible = false;
            }
            else
            {
                Table_2.Visible = true;

            }
        }

    }

【讨论】:

    【解决方案3】:

    这适用于两个未选中的框,因为它们已经未选中,所以更简单。
    我自己也必须这样做。

    private void customer_IsCheckedChanged(object sender, EventArgs e)
    {
        business.IsChecked = false;
    }
    
    private void business_IsCheckedChanged(object sender, EventArgs e)
    {
        customer.IsChecked = false;
    }
    

    【讨论】:

      【解决方案4】:

      对我来说最好的选择和最简单的方法是创建一个 Click 事件而不是 CheckedChanged 事件。 此方法与两个或多个复选框完美配合,并允许将它们全部取消选中。

          private void chkOne_Click(object sender, EventArgs e)
          {
              chkTwo.Checked = false;
          }
      
          private void chkTwo_Click(object sender, EventArgs e)
          {
              chkOne.Checked = false;
          }
      

      【讨论】:

        【解决方案5】:

        更好的版本,允许用户取消选中复选框。

                private void chkOne_CheckedChanged(object sender, EventArgs e)
                {
                    if (chkTwo.Checked == true)
                    {
                        chkTwo.Checked = !chkOne.Checked;
                    }
                }
        
                private void chkTwo_CheckedChanged(object sender, EventArgs e)
                {
                    if (chkOne.Checked == true)
                    {
                        chkOne.Checked = !chkTwo.Checked;
                    }
                }
        

        【讨论】:

          【解决方案6】:

          我建议你使用 check_click 而不是 check_changed

                  private void checkBox1_Click(object sender, EventArgs e)
                  {
                      checkBox2.Checked = false;
                      checkBox3.Checked = false;
                  }
          
                  private void checkBox2_Click(object sender, EventArgs e)
                  {
                      checkBox1.Checked = false;
                      checkBox3.Checked = false;
                  }
          
                  private void checkBox3_Click(object sender, EventArgs e)
                  {
                      checkBox1.Checked = false;
                      checkBox2.Checked = false;
                  }
          

          【讨论】:

            【解决方案7】:
            List<CheckBox> groupOfCheckBoxes = new List<CheckBox>();
            void InitFunction() {
                groupOfCheckBoxes.Add(checkbox1);
                groupOfCheckBoxes.Add(checkbox2);
                groupOfCheckBoxes.Add(checkbox3);
                foreach (CheckBox cb in groupOfCheckBoxes)
                 cb.Click += checkbox_Click
            }
            void checkbox_Click(object sender, EventArgs e) 
            {
             foreach (CheckBox cb in groupOfCheckBoxes) {
              cb.IsChecked = cb == sender;
             }
            }
            

            不过,我也建议使用单选框。 以上代码未经测试,可能有错别字

            【讨论】:

            • 这取决于使用情况。如果复选框不包含在同一个父级中,则需要某种方式来跟踪它们。如果该组有大量复选框列表,您只需在一个区域中添加到该组。如果您只有两个复选框,那么这更多的是矫枉过正。您确实指定了两个复选框,我很抱歉。
            • 我可以看到它的潜力,我绝不会说这是不正确的,但对于这种情况,我在同一个表单上只有两个复选框。所以对我来说有点多:)
            • 我会使用带有 Radioboxes 的 DeveloperGuo,然后可以根据您的需要设置样式(就像复选框一样)。你也没有额外的代码来处理检查/取消检查。
            • 当我在寻找解决问题的方法时,我遇到了这个问题:stackoverflow.com/questions/1410923/… 可能更好地使用此代码?
            【解决方案8】:

            我更喜欢单选按钮,但你可以这样做:

            public void CheckACheckBox(Checkbox ck)
            {
                foreach (Control ckb in this.Controls)
                {
                   if ((ckb is CheckBox) && (ckb == ck))
                      ck.Checked = true;
                   else
                      ck.Checked = false;
                }
            }
            

            【讨论】:

              【解决方案9】:

              如下修改您的代码。

              private void chkBuried_CheckedChanged(object sender, EventArgs e)
              {
                  chkAboveGround.Checked = !chkBuried.Checked;
              }
              private void chkAboveGround_CheckedChanged(object sender, EventArgs e)
              {
                  chkBuried.Checked = !chkAboveGround.Checked;
              }
              

              【讨论】:

              • 完美!谢谢里兹 :)
              • 出现了一种新情况:如果我想取消选中这两个框怎么办?目前,如果我选中一个,然后取消选中,则再次选中另一个。
              • 对于新场景,您可以修改第一个处理程序的主体,如 ... chkAboveGround.Checked = (chkBuried.Checked)?错误:chkAboveGround.Checked;第二个处理程序的类似变化
              猜你喜欢
              • 1970-01-01
              • 2021-12-24
              • 2022-11-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多