我有30个列表框和30个复选框。我希望每个复选框都控制每个listbox.enabled属性。现在,我最好的想法是创建30种不同的方法,每对一对checkbox1 - listbox1,checkbox2 - listbox2等,但我不认为如果我需要在将来添加更多对,这种方法可以很好地扩展
有更简单的方法吗?我想到了一个遍历表单中每个复选框的foreach循环,但是如何让循环理解如果它处理checkbox15它应该改变listbox15的.enabled? 我对此非常陌生,所以我很欣赏不同的建议:)
截至目前,我有30个:(其余的更改为checkBox2 / listBox2等)
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
if (listBox1.Items.Count >= 1)
{
tillgangligaForare.Items.Add(listBox1.Items[0]);
listBox1.Items.Clear();
uppdateraSummering();
}
listBox1.Enabled = false;
listBox1.Items.Add("FORDON EJ I BRUK");
}
else
{
listBox1.Items.Clear();
listBox1.Enabled = true;
}
}
答案 0 :(得分:1)
以下是几种可能的方法:
使用Bindings将列表框上的Enabled属性绑定到其复选框上的Checked属性。您仍然需要编写代码来创建所有绑定(可能有一种方法可以在可视化设计器中执行此操作)
为列表框创建一个复选框字典,并创建一个单击处理程序(您将为每个复选框提供),它将使用" sender"查找正确的列表框以从字典启用/禁用的参数。
这两个都涉及您在添加另一对控件时必须记住更新的代码,但两者都应该只需要为每个新对提供一个或两个新行。
答案 1 :(得分:1)
从发件人参数中找到复选框名称。使用以下命令查找与数字后缀匹配的列表框控件:
int suffix = 1; // Get from Checkbox name suffix
ListBox tbx = this.Controls.Find("listbox" + suffix, true).FirstOrDefault() as ListBox;
tbx.Enabled = false;
答案 2 :(得分:0)
将Lotharyx和Sasway Padhan的两个建议与Form的Load()事件结合起来,给出:
private Dictionary<CheckBox, ListBox> lookup = new Dictionary<CheckBox, ListBox>();
private void Form1_Load(object sender, EventArgs e)
{
ListBox lb;
CheckBox cb;
for (int i = 1; i <= 30; i++)
{
lb = this.Controls.Find("listBox" + i.ToString(), true).FirstOrDefault() as ListBox;
cb = this.Controls.Find("checkBox" + i.ToString(), true).FirstOrDefault() as CheckBox;
if (lb != null && cb != null)
{
lookup.Add(cb, lb);
}
}
}
private void checkBoxes_CheckedChanged(object sender, EventArgs e)
{
CheckBox cb = sender as CheckBox;
if (lookup.ContainsKey(cb))
{
ListBox lb = lookup[cb];
if (cb.Checked)
{
if (lb.Items.Count >= 1)
{
tillgangligaForare.Items.Add(lb.Items[0]);
lb.Items.Clear();
uppdateraSummering();
}
lb.Enabled = false;
lb.Items.Add("FORDON EJ I BRUK");
}
else
{
lb.Items.Clear();
lb.Enabled = true;
}
}
}