C#Win Forms问题删除动态创建的控件

时间:2015-02-20 22:05:40

标签: c# winforms dynamic controls

我有一个从数据库中读取信息的函数,并在从组合框中选择菜单项时动态创建复选框控件。

当用户从组合框中选择不同的项目时,我试图删除页面上已有的任何现有复选框。但是,删除功能仅删除所有其他复选框。知道我做错了什么吗?

表单是超级基本的,只有一个表单,没有标签,只有这个组合框和动态创建的复选框。

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

2 个答案:

答案 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();
    }
}