2016-05-18 8 views
1

Ich möchte Textfelder dynamisch unter trackbar_scroll erstellen. Wenn Trackbar einen Wert von 5 hat, kann es 5 Textfelder haben. Wenn es auf 2 reduziert wird, muss es 2 Textfelder haben. Hier ist das Problem, wenn ich trackbar_scroll Wert zu verringern:Entfernen von TextBox, Standortproblem C#

private void trackBar1_Scroll(object sender, EventArgs e) 
    { 
     foreach (Control ctrl in this.Controls) // to remove all textboxes before creating new 
     { 
      if (ctrl is TextBox) 
      { 
       this.Controls.Remove(ctrl); 
       ctrl.Dispose(); 
      } 
     } 

     int x = 45; // location for textbox 

     for (int i = 0; i < trackBar1.Value; i++) 
     { 
      listBox1.Items.Add(i); 
      TextBox _text = new TextBox(); 
      _text.Name = "txt"+i; 
      _text.Height = 20; 
      _text.Width = 100; 
      _text.Text = _text.Name; 

      _text.Location = new Point(x, 85); 
      this.Controls.Add(_text); 
      x = x + 120; 
     } 
    } 

Antwort

1

Sie nicht die Liste, wie Sie for-each über sie ändern können, aber Sie können, wenn Sie verwenden, um eine Kopie der Liste:

foreach (TextBox tb in this.Controls.OfType<TextBox>().ToList()) { 
    tb.Dispose(); 
} 
+0

danke, es funktioniert. Möchten Sie bitte erläutern. Was ist der Unterschied zwischen foreach (Steuerelement Strg in diesem. Controls) und Ihrem Code. –

+0

@ A.RShaib Der wirkliche Unterschied ist die 'ToList()', die eine Kopie der Liste erstellt. In Ihrem ursprünglichen Code wird durch das Entfernen eines Steuerelements aus der Auflistung die Auflistung geändert, sodass das nächste Steuerelement um eins deaktiviert ist usw. – LarsTech

0

Sie versuchen, this.Controls während der Iteration über foreach zu ändern. Dies ist jetzt erlaubt, da es Buchhaltungsprobleme verursacht. Um Ihren Fehler zu beheben, durchlaufen Sie entweder die Liste rückwärts mit einer for-Schleife, die am Ende beginnt, oder verwenden Sie eine temporäre Liste, um Steuerelemente zu speichern, die Sie entfernen möchten, und dann über diese Liste zu iterieren, um sie tatsächlich zu entfernen.