0

我编写了一个代码来从单个文本框的输入动态创建文本框生成文本框的图像

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

带图像

我用过这段代码

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>();

在这里它工作,但价值每次都会改变

4

6 回答 6

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()- 清除面板上的控件。

于 2012-12-31T10:13:48.657 回答
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);
            }
        } 
    }
于 2012-12-31T10:56:28.523 回答
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);
        }
    }  

如果还有问题请告诉我。

于 2013-01-02T10:29:34.710 回答
0

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

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

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

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

你使用哪一个取决于你。

于 2012-12-31T10:11:23.547 回答
0

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

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

另一种方法是添加一个Panel向其添加生成的控件,这样您就可以myPanel.Controls.Clear()只清除添加到其中的控件。

于 2012-12-31T10:12:14.720 回答
0

您可以使用自己的变量

inputTextBoxes.Add(textBoxNewInput);

删除文本框

else
{
  MessageBox.Show("Enter Value");
  this.Controls.Remove(inputTextBoxes[YourIndex/NameOfControl]);
 }
于 2012-12-31T10:13:47.257 回答