我有一个从数据库中读取信息的函数,并在从组合框中选择菜单项时动态创建复选框控件。
当用户从组合框中选择不同的项目时,我试图删除页面上已有的任何现有复选框。但是,删除功能仅删除所有其他复选框。知道我做错了什么吗?
表单是超级基本的,只有一个表单,没有标签,只有这个组合框和动态创建的复选框。
private void serverModels_SelectedIndexChanged(object sender, EventArgs e)
{
DeleteBoxes();
List<string> eqpIDs = new List<string>();
try
{
DataExtractor dataExtract = new DataExtractor(DataBase.TCDBServerName, DataBase.TCDBname, DataBase.TCDBUserID, DataBase.TCDBPassword);
eqpIDs = dataExtract.GetToolsByServerModel(Convert.ToString(serverModels.SelectedItem));
}
catch (Exception ex)
{
Logger.InsertSystemLog(e.ToString());
MessageBox.Show(ex.ToString());
return;
}
for(int i = 0; i < eqpIDs.Count; i++)
{
CheckBox box = new CheckBox();
box.Checked = true;
box.Tag = "TOOL";
box.Text = eqpIDs[i];
box.AutoSize = true;
box.Location = new Point(50 + 75 * (i / 17), (i % 17) * 25 + 120);
this.Controls.Add(box);
}
}
private void DeleteBoxes()
{
foreach (Control c in this.Controls)
{
if (c is CheckBox && c.Tag.ToString() == "TOOL" )
c.Dispose();
}
}
答案 0 :(得分:1)
Dispose正在从Controls集合中删除控件以及处理控件。
如上所述here,
从控件集合中删除控件后,所有后续控件都会向上移动到集合中的一个位置。
这就是为什么你的逻辑正在跳过所有其他CheckBox。
尝试反向使用 for 循环:
for (int ii = Controls.Count - 1; ii >= 0; ii--)
{
if (Controls[ii] is CheckBox && Controls[ii].Tag.ToString() == "TOOL")
Controls[ii].Dispose();
}
答案 1 :(得分:0)
这似乎正在发生,因为您正在修改控件的Controls
集合,同时迭代它。尝试这样的事情:
private void DeleteBoxes()
{
List<Control> toDispose = new List<Control>();
foreach (Control c in this.Controls)
{
if (c is CheckBox && c.Tag.ToString() == "TOOL" )
toDispose.Add(c);
}
foreach (Control c in toDispose)
{
c.Dispose();
}
}