从表中动态删除控件

本文关键字:删除 控件 动态 | 更新日期: 2023-09-27 18:16:22

我试图删除文本框和标签,而他们的名字从列表框中选择的项目具有相等的值。如果我运行这段代码,只执行第一个If语句,并且只删除表中的标签控件。

我还必须提到,表的控件是动态创建的。

    private void pictureBox2_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < listBox2.SelectedItems.Count; i++)
        {
            foreach (Control t in table2.Controls)
            {
                if (t is Label && t.Text==listBox2.SelectedItem.ToString())
                {
                    table2.Controls.Remove(t);
                    continue;
                }
                if (t is TextBox && t.Name.Contains(listBox2.SelectedItem.ToString()))
                {
                    table2.Controls.Remove(t); continue;
                }
            }
            listBox2.Items.Remove(listBox2.SelectedItems[i]); i--;
        }
    }

这是如何在表中创建控件的。

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        listBox2.Items.Clear();
        this.table2.Controls.Clear();
        foreach (var item in listBox1.SelectedItems)
        {
          table2.Controls.Add(new Label() { Name = item.ToString(), Text = item.ToString(), AutoSize = true });
          table2.Controls.Add(new TextBox() { Name = item.ToString(), AutoSize = true });
            }
        }
    }

从表中动态删除控件

当您从集合中删除一个项(假设位置0的项)时,下一个位置(位置1)的项将移到位置0。但是你的for循环执行下一次迭代,你的索引变成1,所以它终止循环。

避免这种情况的第一种方法是逆序循环,从集合的末尾到集合的开头

但是你也可以用

简化你的代码
private void pictureBox2_Click(object sender, EventArgs e)
{
    for (int i = listBox2.SelectedItems.Count - 1 ; i >= 0 ; i--)
    {
        // This is our search term...
        string curItem = listBox2.SelectedItems[i].ToString();
        // Get only the controls of type Label with Text property equal to the current item
        var labels = table2.Controls
                     .OfType<Label>()
                     .Where (c => c.Text == curItem)
                     .ToList();
       if(labels != null)  
       {
          for(int x = labels.Count()-1; x >= 0; x--)
             table2.Remove(labels[x]);
       }

       // Get only the controls of type TextBox with Name property containing the current item
       var boxes = table2.Controls
                          .OfType<TextBox>()
                          .Where (c => c.Name.Contains(curItem)
                          .ToList();
       if(boxes != null)  
       {
          for(int x = boxes.Count()-1; x >= 0; x--)
             table2.Remove(boxes[x]);
       }
       listBox2.Items.Remove(curItem); 
    }
}

为什么要在for循环结束时自减迭代器?看来你被困在循环里了,伙计。