winforms 选中复选框时启用/禁用特定面板中的特定复选框

xsuvu9jc  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(222)

我正在编写一个C#窗体应用程序。我的窗体上有两个不同的面板,我正在这两个面板上创建动态复选框。我想做的是:如果我选中了panel 1上的特定复选框,我希望禁用/启用panel 2上的特定复选框。

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;
            }
        }
    }
}

“我的代码”没有按照我的要求执行操作。它只需要单击一下即可禁用和启用复选框。而且它禁用了Panel 2中的所有复选框。我只希望禁用一个特定的复选框。

pcww981p

pcww981p1#

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

wvyml7n52#

您需要在创建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);

很明显,你的代码会有所不同,因为你是从数据库中阅读值的。
然后,在创建它们之后,您希望将“Car”链接到“Bcylist”:

LinkCheckBoxes("Car", "Bcylist");

使用此Helper方法:

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;
        };
    }
}

现在当你选中“汽车”时,“Bcylist”将变得禁用。当你取消选中“汽车”时,“Bcylist”将再次启用。
如果关于“链接”的信息在数据库本身中,那么您可以自动化这个过程,而不是将“Car”和“Bcylist”硬编码到LinkCheckBoxes()调用中。

polkgigr

polkgigr3#

场景:两个复选框控制另外三个复选框。checkbox1selected所有从属复选框都将被选中。如果任何一个从属复选框未被选中,则主复选框将被取消选中并重新分配给另一个复选框。
注:根据需要替换所有函数和组件名称。另外,将事件添加到组件中

private async void FormName_Load(object sender, EventArgs e)
{
  checkbox1.checked = true;
  DataSetEnableDisableSettings(true);
}

private void checkbox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkbox1.Checked)
        {
            DataSetEnableDisableSettings(false);
        }
    }

private void checkbox2_CheckedChanged(object sender, EventArgs e)
    {
        if (checkbox2.Checked)
        {
            DataSetEnableDisableSettings(true);
        }
    }

private void dependentCheckbox1_Click(object sender, EventArgs e)
    {
        MasterButtonCheck();
    }

private void dependentCheckbox2_Click(object sender, EventArgs e)
    {
        MasterButtonCheck();
    }

private void dependentCheckbox3_Click(object sender, EventArgs e)
    {
        MasterButtonCheck();
    }

private void DataSetEnableDisableSettings(bool value)
    {
        checkbox1.Checked = value;
        checkbox2.Checked = value;
        checkbox3.Checked = value;
    }

private void MasterButtonCheck()
    {
        bool dependentCheckbox1State = dependentCheckbox1.Checked;
        bool dependentCheckbox2State = dependentCheckbox2.Checked;
        bool dependentCheckbox3State = dependentCheckbox3.Checked;
        if (dependentCheckbox1.Checked && dependentCheckbox2.Checked && dependentCheckbox3.Checked)
        {
            Checkbox1.Checked = true;
        }
        else
        {
            Checkbox2.Checked = true;
            dependentCheckbox1.Checked = dependentCheckbox1State;
            dependentCheckbox2.Checked = dependentCheckbox2State;
            dependentCheckbox3.Checked = dependentCheckbox3State;
        }
    }

相关问题