0

我有一个带有按钮的窗口窗体,当单击按钮时,它会动态生成控件,还添加了一个动态生成的按钮,以便它将删除对齐的控件,这意味着除了按钮之外,还有一行控件单击按钮时删除我的代码是

诠释 c = 0;
        私人无效按钮1_Click(对象发送者,EventArgs e)
        {
            诠释诉;
            v = c++;
            panel1.VerticalScroll.Value = VerticalScroll.Minimum;

            按钮 btn = new Button();
            btn.Name = "btn" + v;
            btn.Text = "删除";
            btn.Location = new Point(750, 5 + (30 * v));
            btn.Click += new EventHandler(btn_Click);

            组合框组合 = 新组合框();
            combo.Name = "组合框" + v;
            combo.Location = new Point(30, 5 + (30 * v));
            组合.标签 = btn;

            组合框combo2 =新组合框();
            combo2.Name = "combobox2" + v;
            combo2.Location = new Point(170, 5 + (30 * v));
            组合2.标签= btn;

            文本框 txt = 新文本框();
            txt.Name = "txtbx" + v;
            txt.Location = new Point(300, 5 + (30 * v));
            txt.标签 = btn;

            文本框 txt2 = 新文本框();
            txt2.Name = "txtbx2" + v;
            txt2.Location = new Point(450, 5 + (30 * v));
            txt2.标签 = btn;

            文本框 txt3 = 新文本框();
            txt3.Name = "txtbx3" + v;
            txt3.Location = new Point(600, 5 + (30 * v));
            txt3.标签 = btn;

            panel1.Controls.Add(组合);
            panel1.Controls.Add(btn);
            panel1.Controls.Add(txt);
            panel1.Controls.Add(combo2);
            panel1.Controls.Add(txt2);
            panel1.Controls.Add(txt3);   
        }
        private void btn_Click(object sender, EventArgs e)// 这是动态添加的按钮事件,它将删除组合框和文本框
        {
            按钮 btnh = 作为按钮的发送者;
            foreach(panel1.Controls.OfType<TextBox>() 中的控制项)
            {
                if (item.Tag == 发件人 || item == 发件人)
                    panel1.Controls.Remove(item);
            }
            foreach(panel1.Controls.OfType<ComboBox>() 中的控制项)
            {
                if (item.Tag == 发件人 || item == 发件人)
                    panel1.Controls.Remove(item);
            }
            panel1.Controls.Remove(btnh);
        }

我的错误没什么,但问题是它不会删除它留下的所有控件,我不知道问题是什么我的代码简单易行,但我不知道它缺少什么

4

2 回答 2

3

问题是您在遍历集合时正在删除项目。在这种情况下,foreach 语句可能会跳过项目。首先将要删除的项目存储在列表中:

List<Control> toBeRemoved = panel1.Controls
    .Cast<Control>()
    .Where(c => c.Tag == sender)
    .ToList();
foreach (Control c in toBeRemoved) {
    panel1.Controls.Remove(c);
}

如果您向后循环,您也可以轻松地在循环中删除:

for (int i = panel1.Controls.Count - 1; i >= 0; i--) {
    if (panel1.Controls[i].Tag == sender) {
        panel1.Controls.RemoveAt(i);
    }
}
于 2012-12-15T20:07:54.410 回答
3

在 foreach 循环中删除项目通常会导致列表在您遍历时发生更改。

这个 linq 应该可以解决问题:

private void btn_Click(object sender, EventArgs e)// this is the dynamically added button's event which will remove the combobox and textbox
    {
        Button btnh = sender as Button;
        panel1.Controls.OfType<TextBox>().Where(i => i.Tag == sender || i == sender).ToList().ForEach(i => panel1.Controls.Remove(i));
        panel1.Controls.OfType<ComboBox>().Where(i => i.Tag == sender || i == sender).ToList().ForEach(i => panel1.Controls.Remove(i));

        panel1.Controls.Remove(btnh);
    }

为什么 linq foreach 有效,但我不确定:)

于 2012-12-15T20:22:03.023 回答