我编写了一个代码,用于从单个文本框的输入中动态创建文本框。
当用户输入数据时,它应该自动生成像这样的文本框....
我已使用此代码
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>();
这里有效,但值每次都会改变
答案 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]);
}