删除动态创建的文本框

时间:2012-12-31 10:04:52

标签: c# forms textbox

我编写了一个代码,用于从单个文本框Image to generate textbox的输入中动态创建文本框。

当用户输入数据时,它应该自动生成像这样的文本框....

With Images

我已使用此代码

private void textBoxInput_TextChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(textBoxInput.Text))
        {
            //Get the number of input text boxes to generate
            int inputNumber = Int32.Parse(textBoxInput.Text);

            //Initialize list of input text boxes
            inputTextBoxes = new List<TextBox>();

            //Generate labels and text boxes
            for (int i = 1; i <= inputNumber; i++)
            {
                //Create a new label and text box
                Label labelInput = new Label();
                TextBox textBoxNewInput = new TextBox();

                //Initialize label's property
                labelInput.Text = "Product" + i;
                labelInput.Location = new Point(30, textBoxInput.Bottom + (i * 30));
                labelInput.AutoSize = true;

                //Initialize textBoxes Property
                textBoxNewInput.Location = new Point(labelInput.Width, labelInput.Top - 3);

                //Add the newly created text box to the list of input text boxes
                inputTextBoxes.Add(textBoxNewInput);

                //Add the labels and text box to the form
                this.Controls.Add(labelInput);
                this.Controls.Add(textBoxNewInput);
            }


        }
 }

它工作正常,但我想更新该文本框,如果用户更改文本框中的值,它应该动态更改。但它没有发生

我还尝试使用其他条件

 else
        {
            MessageBox.Show("Enter Value");

            this.Controls.Clear();
            this.Controls.Clear();

        }

但它会删除此表单中的所有值。

如何只删除生成的文本框

更新 在这里,我按照@New Developer

的想法进行了更改
 if (!string.IsNullOrEmpty(textBoxInput.Text))
        {
            //Get the number of input text boxes to generate
            int inputNumber = Int32.Parse(textBoxInput.Text);

            if (inputTextBoxes != null && inputTextBoxes.Count > inputNumber)
            {
                int removecount = inputTextBoxes.Count - inputNumber;

                for (int i = 0; i < removecount; i++)
                {
                    TextBox t = inputTextBoxes[inputTextBoxes.Count - 1];
                    inputTextBoxes.RemoveAt(inputTextBoxes.Count - 1);
                    t.Dispose();
                }

                return;
            }


            if (inputlabels != null && inputlabels.Count > inputNumber)
            {
                int removecount2 = inputlabels.Count - inputNumber;

                for (int i = 0; i < removecount2; i++)
                {
                    Label l = inputlabels[inputlabels.Count - 1];
                    inputlabels.RemoveAt(inputlabels.Count - 1);
                    l.Dispose();
                }

                return;
            }

            //Generate labels and text boxes
            for (int i = 1; i <= inputNumber; i++)
            {
                //Create a new label and text box
                Label labelInput = new Label();
                TextBox textBoxNewInput = new TextBox();

                //Initialize label's property
                labelInput.Text = "Product" + i;
                labelInput.Location = new Point(30, textBoxInput.Bottom + (i * 30));
                labelInput.AutoSize = true;

                //Initialize textBoxes Property
                textBoxNewInput.Location = new Point(labelInput.Width, labelInput.Top - 3);

                //Add the newly created text box to the list of input text boxes
                inputTextBoxes.Add(textBoxNewInput);
                inputlabels.Add(labelInput);

                //Add the labels and text box to the form
                this.Controls.Add(labelInput);
                this.Controls.Add(textBoxNewInput);
            }
        }
    }

并且还添加了

    List<TextBox> inputTextBoxes = new List<TextBox>();
    List<Label> inputlabels = new List<Label>();

这里有效,但值每次都会改变

6 个答案:

答案 0 :(得分:1)

两种方法:

一种方法是维护一个指向文本框的指针列表。创建它们时的标签:

在班级定义中,添加私人列表变量:

public partial class Form1 : Form
{
    private List<TextBox> generatedTextboxes = new List<TextBox>();
    private List<Label> generatedLabels = new List<Label>();

....

现在,在创建它们时,将它们添加到列表中:

//Generate labels and text boxes
for (int i = 1; i <= inputNumber; i++)
{
    //Create a new label and text box
    Label labelInput = new Label();
    TextBox textBoxNewInput = new TextBox();
    //Keep track of the references
    generatedTextboxes.Add(textBoxNewInput);
    generatedLabels.Add(labelInput );
    ....

现在,当你想删除它们时:

for (int i = 1; i <= generatedTextboxes.Count; i++)
{
    this.Controls.Remove(generatedTextboxes[i]);
    this.Controls.Remove(generatedLabels[i]);
}

generatedTextboxes.Clear();
generatedLabels.Clear();

另一种方法是将Panel控件放在表单上,​​然后将新的文本框/标签添加到表单上,而不是直接添加到主表单上。然后,执行panel1.Controls.Clear() - 只需清除面板上的控件。

答案 1 :(得分:1)

修改
抱歉,我的代码出错了。这绝对可以。试试这个。如果这也行不通,请告诉我。

    List<TextBox> inputTextBoxes =  new List<TextBox>();

    private void textBoxInput_TextChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(textBoxInput.Text))
        {
            //Get the number of input text boxes to generate
            int inputNumber = Int32.Parse(textBoxInput.Text);
            if (inputTextBoxes != null && inputTextBoxes.Count > inputNumber)
            {
                int removecount = inputTextBoxes.Count - inputNumber;

                for (int i = 0; i < removecount; i++)
                {
                    TextBox t = inputTextBoxes[inputTextBoxes.Count-1];
                    inputTextBoxes.RemoveAt(inputTextBoxes.Count - 1);
                    t.Dispose();
                }

                return;
            }                

            //Generate labels and text boxes
            for (int i = 1; i <= inputNumber; i++)
            {
                //Create a new label and text box
                Label labelInput = new Label();
                TextBox textBoxNewInput = new TextBox();

                //Initialize label's property
                labelInput.Text = "Product" + i;
                labelInput.Location = new Point(30, textBoxInput.Bottom + (i * 30));
                labelInput.AutoSize = true;

                //Initialize textBoxes Property
                textBoxNewInput.Location = new Point(labelInput.Width, labelInput.Top - 3);

                //Add the newly created text box to the list of input text boxes
                inputTextBoxes.Add(textBoxNewInput);

                //Add the labels and text box to the form
                this.Controls.Add(labelInput);
                this.Controls.Add(textBoxNewInput);
            }
        } 
    }

答案 2 :(得分:1)

这是新代码

        if (!string.IsNullOrEmpty(textBoxInput.Text))
        {
            //Get the number of input text boxes to generate
            int inputNumber = Int32.Parse(textBoxInput.Text);

            if (inputTextBoxes != null && inputTextBoxes.Count > inputNumber)
            {
                int removecount = inputTextBoxes.Count - inputNumber;

                for (int i = 0; i < removecount; i++)
                {
                    TextBox t = inputTextBoxes[inputTextBoxes.Count - 1];
                    inputTextBoxes.RemoveAt(inputTextBoxes.Count - 1);
                    t.Dispose();

                    Label l = inputlabels[inputlabels.Count - 1];
                    inputlabels.RemoveAt(inputlabels.Count - 1);
                    l.Dispose();
                }

                return;
            }

        //Generate labels and text boxes
        for (int i = 1; i <= inputNumber; i++)
        {
            //Create a new label and text box
            Label labelInput = new Label();
            TextBox textBoxNewInput = new TextBox();

            //Initialize label's property
            labelInput.Text = "Product" + i;
            labelInput.Location = new Point(30, textBoxInput.Bottom + (i * 30));
            labelInput.AutoSize = true;

            //Initialize textBoxes Property
            textBoxNewInput.Location = new Point(labelInput.Width, labelInput.Top - 3);

            //Add the newly created text box to the list of input text boxes
            inputTextBoxes.Add(textBoxNewInput);
            inputlabels.Add(labelInput);

            //Add the labels and text box to the form
            this.Controls.Add(labelInput);
            this.Controls.Add(textBoxNewInput);
        }
    }  

如果仍有问题请告诉我。

答案 3 :(得分:0)

您需要跟踪已添加的控件,然后调用remove:

this.Controls.Remove(labelInput);
this.Controls.Remove(textBoxNewInput);

您可以通过多种方式跟踪:

  • 创建私人字段
  • 将它们存储在字典中
  • 使用一些唯一标识符标记控件,以便您可以再次找到它们。

您使用哪一个取决于您。

答案 4 :(得分:0)

当您将控件拖放到表单中时,引擎盖下的Visual Studio会创建代码来添加这些控件。这些创建类似于您创建文本框的方式,因此您必须引入一些方法来识别您认为“生成”的控件。

一种方法是将这些控件添加到List<Control>,以便您保留“您的”控件的引用。

另一种方法是添加Panel添加生成的控件,这样您就可以使用myPanel.Controls.Clear()清除添加到它的控件。

答案 5 :(得分:0)

您可以使用自己的变量

inputTextBoxes.Add(textBoxNewInput);

删除文本框

else
{
  MessageBox.Show("Enter Value");
  this.Controls.Remove(inputTextBoxes[YourIndex/NameOfControl]);
 }