2012-12-15 93 views
-1

我有窗体有一个按钮,当按钮被点击时动态生成的控件,也添加一个动态生成的按钮,以便它将删除控件是在线,是指抛开按钮,当按钮点击我的代码是如何删除使用标签属性动态添加的控件

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问题删除它离开控制所有的控制,我不知道什么控制的排将被删除问题我的代码很简单容易,但我不知道它缺少的地方

+0

这是执行只在'C#'或者是你做任何'interop' ? – bonCodigo

+0

看看这个MSDN链接'Control.Tag属性'-http://msdn.microsoft.com/en-us/library/system.windows.forms.control.tag.aspx – MethodMan

+0

我正在使用Windows窗体我不知道别人,对不起,我的英语不太好,如果我误解你 –

回答

3

问题是你正在删除它ems,而你在循环收集。在这种情况下,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); 
    } 
} 
+0

谢谢,但我会真的很感激,如果你会解释这是什么 列表 toBeRemoved = panel1.Controls.Cast ().Where(c => c.Tag == sender).ToList(); 我知道这是一个列表,但是C =>什么是所有东西,我已经看到这第一次 有没有其他的解决方案来解决这个问题? –

+0

并且您的解决方案仅用于删除发件人,然后如何删除与发件人相关的标签?你能解释一下,先生, –

+0

那么,这是一个LINQ(语言集成查询)。 'Controls'集合不实现'IEnumerable ',但是LINQ的源代码是一个。因此'Cast '将'Controls'集合转换为'IEnumerable '。然后,Where子句选择其“Tag”等于“发件人”(按钮)的控件。最后,结果创建一个列表。表达式'c => c.Tag == sender'是一个lambda表达式。你可以把它想成一个写一个函数方法的非常简洁的方式。 'Where'子句使用此函数来测试枚举的项目。 –

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工作我不知道,虽然:)

+0

that works,thank you.sir –

+1

You很受欢迎。我会认为这个工程的原因是因为'ToList()'创建了一个临时列表,但我也不完全确定。 – JGaarsdal

+0

@JGaarsdal,是的,在ToList()之后,你正在创建一个临时列表(IL创建一个局部变量),并且从另一个列表中删除项目。这就是为什么它的工作。你的猜测是正确的。 – Mafii

相关问题