2014-02-27 2 views
0

아래 코드가 있습니다. 여기에 버튼 클릭시 동적으로 2 개의 텍스트 상자와 버튼이 추가됩니다. 동적으로 생성 된 버튼에 텍스트 상자를 태그 지정합니다 (제거). 그래서 제거 단추를 클릭하면 그것에 텍스트 상자를 제거해야합니다. 그러나 단 하나의 텍스트 상자가 제거되고 다른 텍스트 상자는 제거되지 않습니다. tat에 대한 이유를 찾을 수 없습니다.동적으로 추가 할 때 버튼에 태그가 지정된 텍스트 상자 삭제

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