创建动态命名的textBoxes

时间:2011-06-03 22:29:04

标签: c# winforms

每次点击按钮我都需要创建一个新的文本框。我知道它将如何工作一次,但不是多次。

TextBox NewTB = new TextBox();
NewTB...// set textbox properties
this.Controls.Add(NewTB);

每次单击按钮(NewTB1,NewTB2等)时,我都需要NewTB不同,我尝试了包含我想要的名称的List<>,然后将名称指定为{{1成员,但那不起作用。我可以使用某种包含TextBoxes的List<>吗?我真的不确定如何实现它。

2 个答案:

答案 0 :(得分:1)

如果你想保持引用文本框的能力,你需要一个列表(这将使你能够创建无限数量的列表),然后在列表中添加对新文本框的引用时间你向控件添加相同的引用。每次单击该按钮时,都应将文本框设置为文本框的新实例,然后将该实例的引用添加到控件和列表中。

实施例: 制作TextBoxen:

boolean iNeedMoreTextBoxes = true; //A simple boolean to be changed when you want
                                   //want to stop adding TextBoxes
List<TextBox> textBoxes = new List<TextBox>(); //This makes a list of TextBoxes
TextBox tb = new TextBox(); //tb is nothing more than a pointer to the new TextBox
while(iNeedMoreTextBoxes){
   textBoxes.add(tb); //The pointer is added to the List
   control.add(tb); //The same pointer is added to the control
   tb = new TextBox(); //Make another TextBox
   iNeedMoreTextBoxes = checkToSeeIfINeedMoreTextBoxes();
}

好的,那样做的是制作一堆对象,并将每个对象的引用提供给List和控件。现在,每当您使用List的引用来更改对象时,控件也会更改,因为它具有对同一对象的引用。从而, 要检索TextBoxen:

for(int i = 0; i < testBoxes.length(); i++){
   textBoxes.get(i).makeChanges(); //makeChanges isn't really a function, just an example
}

现在,如果您需要能够对一个特定的TextBox进行更改,TextBox类必须有一些标识字段,然后您可能会使用它:

int id = getTheIDofTheTextBoxINeed(); //this can be any identifier that you can check
for(int i = 0; i < testBoxes.length(); i++){
  if(textBoxes.get(i).getID() == id) //Yay we found the right one, now make the changes
     textBoxes.get(i).makeChanges();
}

这或多或少都是你做的。

编辑:这是java代码,因为我对C#不太熟悉。但是,我知道基本原则适用于两种语言,只是一些语法不同。

答案 1 :(得分:1)

示例中的名称“NewTB”只是一个变量名称。它没有以任何方式分配给该文本框。文本框的“列表”驻留在控件结构中。换句话说,当您说this.Controls.Add(NewTB)时,您将该文本框添加到控件列表中。

如果您向我们展示的代码作为点击处理程序的一部分发生,则每次单击该按钮时都会运行该代码,因此每次都会添加一个新的文本框。 this.Controls本质上是用于跟踪表单上控件(包括文本框)的列表。