我有一个窗口,其中有一个按钮,当按钮被点击它动态生成控件时,还会添加一个动态生成的按钮,这样它就会删除一行中的控件,意味着除了按钮,一行控件将是按下按钮时删除了我的代码
int c = 0;
private void button1_Click(object sender, EventArgs e)
{
int v;
v = c++;
panel1.VerticalScroll.Value = VerticalScroll.Minimum;
Button btn = new Button();
btn.Name = "btn" + v;
btn.Text = "Remove";
btn.Location = new Point(750, 5 + (30 * v));
btn.Click += new EventHandler(btn_Click);
ComboBox combo = new ComboBox();
combo.Name = "combobox" + v;
combo.Location = new Point(30, 5 + (30 * v));
combo.Tag = btn;
ComboBox combo2 = new ComboBox();
combo2.Name = "combobox2" + v;
combo2.Location = new Point(170, 5 + (30 * v));
combo2.Tag = btn;
TextBox txt = new TextBox();
txt.Name = "txtbx" + v;
txt.Location = new Point(300, 5 + (30 * v));
txt.Tag = btn;
TextBox txt2 = new TextBox();
txt2.Name = "txtbx2" + v;
txt2.Location = new Point(450, 5 + (30 * v));
txt2.Tag = btn;
TextBox txt3 = new TextBox();
txt3.Name = "txtbx3" + v;
txt3.Location = new Point(600, 5 + (30 * v));
txt3.Tag = btn;
panel1.Controls.Add(combo);
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)// this is the dynamically added button's event which will remove the combobox and textbox
{
Button btnh = sender as Button;
foreach (Control item in panel1.Controls.OfType<TextBox>())
{
if (item.Tag == sender || item == sender)
panel1.Controls.Remove(item);
}
foreach (Control item in panel1.Controls.OfType<ComboBox>())
{
if (item.Tag == sender || item == sender)
panel1.Controls.Remove(item);
}
panel1.Controls.Remove(btnh);
}
我的错误是什么,但问题是它dosnt删除它离开控件的所有控件,我不知道什么是我的代码简单易行的问题,但我不知道它缺乏的地方
2 回答
删除foreach循环中的项目通常会导致在遍历它时更改列表的问题 .
这个linq应该可以解决这个问题:
为什么linq foreach工作我不确定:)
问题是您在循环收集集时删除项目 . 在这种情况下,foreach语句可能会跳过项目 . 首先将要删除的项目存储在列表中:
如果向后循环,也可以轻松地在循环中删除: