删除按钮上的文本框/标签单击C#

删除按钮上的文本框/标签单击C#,c#,winforms,C#,Winforms,我试图通过按下按钮一个接一个地删除文本框和标签。 我有一个名为InputExtBox的文本框列表 以下是用于添加的代码: private void onClickAdd(object sender, EventArgs e) { inputTextBoxes = new List<TextBox>(); Label label1 = new Label(); label1.Name = "label1"; lab

我试图通过按下按钮一个接一个地删除文本框和标签。 我有一个名为InputExtBox的文本框列表

以下是用于添加的代码:

private void onClickAdd(object sender, EventArgs e)
    {
        inputTextBoxes = new List<TextBox>();
        Label label1 = new Label();
        label1.Name = "label1";
        label1.Text = "w" + i;
        label1.Location = new System.Drawing.Point(5, 10 + (20 * i));
        label1.Size = new System.Drawing.Size(30, 20);
        this.Controls.Add(label1);

            TextBox text1 = new TextBox();
            text1.Name = "text1";
            text1.Location = new System.Drawing.Point(35, 10 + (20 * i));
            text1.Size = new System.Drawing.Size(25, 20);
            inputTextBoxes.Add(text1);
            this.Controls.Add(text1);
            i++;
    }

但是它只删除最后添加的文本框,再次单击按钮没有任何作用。

如果一次只删除一个文本框,为什么需要foreach循环?只需抓取最后一个或第一个文本框,如果该文本框不为null,则将其从控件中删除:

 private void onClickRemove(object sender, EventArgs e)
 {
     var textBoxToRemove = inputTextBoxes.LastOrDefault();
     // or
     // var textBoxToRemove = inputTextBoxes.FirstOrDefault();
     if (textBoxToRemove != null)
     {
         this.Controls.Remove(textBoxToRemove);
         inputTextBoxes.Remove(textBoxToRemove);
     }
 }
确保您也从InputExtBox中删除它,以便下次您要求删除文本框时,它不会再次尝试删除它并继续下一个

编辑

@Piotr Nowak指出了您的另一个问题,每次添加新文本框时,您都会为InputExtBox分配一个新列表,创建类时应该只分配一次该列表。

从onClickAdd方法中删除此项:

inputTextBoxes = new List<TextBox>();
inputTextBoxes = new List<TextBox>();
InputTextBox=新列表();
并在将列表声明为类中的字段时使用此选项:

private readonly inputTextBoxes = new List<TextBox>();
private readonly inputtextbox=new List();

如果一次只删除一个文本框,为什么需要foreach循环?只需抓取最后一个或第一个文本框,如果该文本框不为null,则将其从控件中删除:

 private void onClickRemove(object sender, EventArgs e)
 {
     var textBoxToRemove = inputTextBoxes.LastOrDefault();
     // or
     // var textBoxToRemove = inputTextBoxes.FirstOrDefault();
     if (textBoxToRemove != null)
     {
         this.Controls.Remove(textBoxToRemove);
         inputTextBoxes.Remove(textBoxToRemove);
     }
 }
确保您也从InputExtBox中删除它,以便下次您要求删除文本框时,它不会再次尝试删除它并继续下一个

编辑

@Piotr Nowak指出了您的另一个问题,每次添加新文本框时,您都会为InputExtBox分配一个新列表,创建类时应该只分配一次该列表。

从onClickAdd方法中删除此项:

inputTextBoxes = new List<TextBox>();
inputTextBoxes = new List<TextBox>();
InputTextBox=新列表();
并在将列表声明为类中的字段时使用此选项:

private readonly inputTextBoxes = new List<TextBox>();
private readonly inputtextbox=new List();

您在OnClickAdd()方法中不断创建新列表:

InputTextBox=新列表();
尝试检查InputExtBox是否为空,然后执行这行代码。否则,就让其余的代码运行。
另外,记住在onClickRemove()方法完成删除文本框/标签后清除InputTextBox列表。

您在OnClickAdd()方法中不断创建一个新列表:

InputTextBox=新列表();
尝试检查InputExtBox是否为空,然后执行这行代码。否则,就让其余的代码运行。
另外,请记住在onClickRemove()方法完成删除文本框/标签后清除InputTextBox列表。

因为您只有一个文本框请选中此链接-这样做将一次单击删除所有文本框,而不是一个接一个。您也可以简单地隐藏文本框。如果您不需要为任何其他控件保留该位置(意味着您没有在该位置添加任何其他控件)@mihai11因为您只有1个文本框请选中此链接-这样做将在单击时删除所有文本框,而不是逐个删除。您也可以简单地隐藏文本框。如果您不需要为任何其他控件保留该位置(意味着您不需要在该位置添加任何其他控件)@mihai11尝试了此操作,但它仍然只删除最后一个/第一个。很高兴我能提供帮助!我可以看到你是新来的,所以如果你觉得有答案解决了问题,你可以点击绿色复选标记将其标记为“已接受”。谢谢你的提示!尝试过这个,但它仍然只删除最后一个/第一个很高兴我能帮上忙!我可以看到你是新来的,所以如果你觉得有答案解决了问题,你可以点击绿色复选标记将其标记为“已接受”。谢谢你的提示!