2016-05-18 7 views
1

trackbar_scrollにテキストボックスを動的に作成したいと思います。 トラックバーの値が5の場合、5つのテキストボックスがあります。 2になると、2つのテキストボックスが必要です。ここで私はtrackbar_scroll値を下げる問題がある:TextBoxの削除、場所の問題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; 
     } 
    } 

答えて

1

あなたがリストのコピーを使用する場合は、のために、各その上、あなたのようにリストを変更することはできませんが、次のことができます。

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

ありがとう、それは動作します。どうぞよろしくお願いしますか。 foreach(this.Controlsのcontrol ctrl) とあなたのコードの違いは何ですか? –

+0

@ A.RShaib実際の違いは、リストのコピーを作成する 'ToList()'です。元のコードでは、コレクションからコントロールを削除するとコレクションが変更されるため、次のコントロールは1つオフになります。 – LarsTech

0

を修正している間に、foreachでそれを繰り返しています。これは簿記の問題を引き起こすので、これは現在許可されています。あなたのバグを修正するには、最後から始まるforループを使ってリストを逆向きに反復するか、一時的なリストを使って削除したいコントロールを格納し、そのリストを反復して実際に削除します。