【问题标题】:Enable/Disable specific checkbox in a specific Panel when a checkbox is checked选中复选框时启用/禁用特定面板中的特定复选框
【发布时间】:2020-10-31 09:17:57
【问题描述】:

我正在编写一个 C# Forms 应用程序。 我的表单上有两个不同的面板,我正在两个面板上创建动态复选框。我想做的是:如果我选中 panel1 上的特定复选框,我想禁用/启用 panel2 上的特定复选框。

foreach (Control checkbox_panel1 in checkBoxPanel1.Controls)
{
    foreach (Control checkbox_panel2 in checkBoxPanel2.Controls)
    {
        if (checkbox_panel1 is CheckBox)
        {
            CheckBox cb_p1 = (CheckBox)checkbox_panel1;
            CheckBox cb_p2 = (CheckBox)checkbox_panel2;

            if (cb_p1.Checked)
            {
                cb_p2.Enabled = false;
            }
            else
            {
                cb_p2.Enabled = true;
            }
        }
    }
}

我的代码没有做我想做的事。一键禁用和启用复选框。它正在禁用 Panel2 中的所有复选框我只想禁用一个特定的复选框。

【问题讨论】:

  • 您正在循环通过面板中的所有控件并禁用或启用所有复选框。您是否有逻辑来确定启用或禁用哪个特定复选框?
  • 您应该使用复选框的 checedChanged 事件。 docs.microsoft.com/en-us/dotnet/api/…
  • 我想说你可以使用checkbox1的checked事件来禁用checkbox2,但是如果panel1中的哪个复选框被选中,你怎么知道panel2中的哪个复选框被禁用?
  • 我正在使用 checkedChanged 事件。我的表单连接到数据库并获取我的数据库的值并创建以值作为名称的复选框。例如,我的第一个复选框称为 Car。如果我单击此复选框,我想禁用我的 panel2 上的 Checkbox Bcylist。

标签: c# winforms checkbox panel


【解决方案1】:

if(cb_p1.name == "your checkbox name")
    {
        if (cb_p1.Checked)
            {
                cb_p2.Enabled = false;
            }
            else
            {
                cb_p2.Enabled = true;
            }
    }

【讨论】:

    【解决方案2】:

    您需要在创建 CheckBox 时设置它们的 .Name 属性:

    CheckBox cb1 = new CheckBox();
    cb1.Name = "Car"; // make sure you set the NAME property!
    cb1.Text = "Car";
    panel1.Controls.Add(cb1);
    
    CheckBox cb2 = new CheckBox();
    cb2.Name = "Bcylist"; // make sure you set the NAME property!
    cb2.Text = "Bicyclist";
    panel2.Controls.Add(cb2);
    

    很明显,您的代码会有所不同,因为您正在从数据库中读取值。上面的重点是我们设置了CheckBoxes的.Name属性。

    然后,在您创建它们之后,您希望将“Car”链接到“Bcylist”:

    LinkCheckBoxes("Car", "Bcylist");
    

    使用这个辅助方法:

    private void LinkCheckBoxes(string cbName1, string cbName2)
    {
        var ctl1 = this.Controls.Find(cbName1, true).FirstOrDefault();
        var ctl2 = this.Controls.Find(cbName2, true).FirstOrDefault();
        if (ctl1 != null && ctl1 is CheckBox && ctl2 != null && ctl2 is CheckBox)
        {
            CheckBox cb1 = (CheckBox)ctl1;
            CheckBox cb2 = (CheckBox)ctl2;
            cb1.CheckedChanged += (s, e) => {
                cb2.Enabled = !cb1.Checked;
            };
        }
    }
    

    现在,当您选中“汽车”时,“自行车列表”将被禁用。当您取消选中“Car”时,“Bcylist”将再次启用。

    如果有关“链接”的信息在数据库本身中,那么您可以自动执行此过程,而不是将“Car”和“Bcylist”硬编码到 LinkCheckBoxes() 调用中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      相关资源
      最近更新 更多