2014-02-27 117 views
0

以下是代碼。在這裏我添加2個文本框和按鈕點擊動態按鈕。我將文本框標記爲動態創建的按鈕(刪除)。因此,點擊刪除按鈕,我需要刪除標記爲它的文本框。但只有1個文本框被刪除,而不是其他。我無法找出達成協議的理由。刪除動態添加時標記爲按鈕的文本框

private void button1_Click(object sender, EventArgs e) 
    { 
    int c=0; 
int v; 
v = c++; 
    panel1.VerticalScroll.Value = VerticalScroll.Minimum; 

Button btn = new Button(); 
btn.Name = "btn" + v; 
btn.Text = "Remove"; 
btn.Location = new Point(370, 5 + (30 * v)); 
btn.Click += new EventHandler(btn_Click); 


TextBox txt = new TextBox(); 
txt.Name = "TextBox" + v; 
txt.Location = new Point(30, 5 + (30 * v)); 
txt.Tag = btn; 


TextBox txt1 = new TextBox(); 
txt1.Name = "TextBox2" + v; 
txt1.Location = new Point(170, 5 + (30 * v)); 
txt1.Tag = btn; 


panel1.Controls.Add(txt); 
panel1.Controls.Add(txt1); 

panel1.Controls.Add(btn); 

} 

private void btn_Click(object sender, EventArgs e) 
{ 


    //to remove control by Name 
    foreach (Control item in panel1.Controls.OfType<Control>()) 
{ 
    if (item.Tag == sender || item == sender) 
     panel1.Controls.Remove(item); 
} 
} 
+0

請不要包含關於問題標題中使用的語言的信息,除非在沒有它的情況下沒有意義。標籤用於此目的。 –

回答

0

當刪除從列表中的項目,而是採用了foreach,請嘗試使用for,和向後遍歷。下面的問題有一些解決方案,在本質上與此類似:

Safely Removing DataRow In ForEach

所以,這樣的事情(我還沒有測試此代碼,但這是一般的想法):

// Iterate over each control to remove, and remove it 
for (int i = panel1.Controls.Count - 1; i >= 0; i--) 
{ 
    var item = panel1.Controls[i]; 
    if (item.Tag == sender || item == sender) 
     panel1.Controls.Remove(item); 
}