删除文本框,位置问题C#

删除文本框,位置问题C#,c#,dynamic,textbox,trackbar,C#,Dynamic,Textbox,Trackbar,我想在轨迹栏上动态创建文本框。如果轨迹栏的值为5,则它可能有5个文本框。当它减少到2时,它必须有2个文本框。当我减小轨迹栏滚动值时,问题如下: private void trackBar1_Scroll(object sender, EventArgs e) { foreach (Control ctrl in this.Controls) // to remove all textboxes before creating new {

我想在轨迹栏上动态创建文本框。如果轨迹栏的值为5,则它可能有5个文本框。当它减少到2时,它必须有2个文本框。当我减小轨迹栏滚动值时,问题如下:

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;
        }
    }
private void trackBar1\u滚动条(对象发送方,事件参数e)
{
foreach(Control ctrl在此.Controls中)//在创建新文本框之前删除所有文本框
{
如果(ctrl为文本框)
{
此控件为.Controls.Remove(ctrl);
ctrl.Dispose();
}
}
int x=45;//文本框的位置
对于(int i=0;i
您不能在每次修改列表时对其进行修改,但如果您使用列表的副本,则可以:

foreach (TextBox tb in this.Controls.OfType<TextBox>().ToList()) {
  tb.Dispose();
}
foreach(this.Controls.OfType().ToList()中的文本框tb){
tb.Dispose();
}

您正试图修改
此。通过
foreach
对其进行迭代时控制
。现在这是允许的,因为它会导致簿记问题。要修复您的bug,可以使用从末尾开始的for循环向后遍历列表,或者使用临时列表存储您要删除的控件,然后遍历该列表以实际删除它们。

谢谢,它可以工作。请你详细说明一下好吗。foreach(在这个.Controls中是control-ctrl)和您的代码之间有什么区别。@A.RShaib真正的区别是创建列表副本的
ToList()
。在原始代码中,从集合中删除控件会更改集合,因此下一个控件将关闭一个,以此类推。