我正在制作一个用于用户输入的表单,每次用户单击按钮时,都会添加一个新文本框供他们输入。
我能够毫无问题地创建文本框,但是在命名它们时遇到了问题。 它们都需要有不同的名称(否则它们会相互覆盖(,所以我想做这样的事情:
string strName = "txt"+counter.toString();
HtmlGenericControl gc = new HtmlGenericControl("li");
InputList.Controls.Add(gc);
TextBox strName = new TextBox();
strName.Text = "hello world"+counter.toString();
gc.addControls.Add(strName);
Vs 不喜欢这样,但我需要能够提供许多自动生成的文本框。 关于如何解决此问题的任何建议,或者您可以推荐另一种方法吗?
为什么需要string strName = "txt"+counter.toString();
?
您可以尝试像这样更改ID
属性,而不是更改TextBox
es 的Text
属性:
HtmlGenericControl gc = new HtmlGenericControl("li");
gc.ID = "li"+counter.toString(); //This is needed to take it later
InputList.Controls.Add(gc);
TextBox strName = new TextBox();
strName.Text = "txtbox"+counter.toString();
gc.addControls.Add(strName);
然后,如果要从这些TextBox
es中获取值,则应使用:
TextBox txtbox = (TextBox)(InputList.FindControl("li1").FindControl("txtbox1"));
var inputText = txtbox.Text; //This contains the text inside the `TextBox`
编辑
正如 Vilx- 提到的,每次单击添加按钮时都会发生新的回发,因此,您必须找到一种方法来加载回发时已创建的TextBox
。 最好的方法是完全在前端使用 JavaScript/JQuery 动态创建input
字段,并在表单提交时将它们发送回服务器。
下面是一个示例:如何使用 javascript 在 asp.net Web 表单上动态添加文本框:
ASP.NET WebForms 在动态生成的控件方面是一个 PITA。我建议找到一个好的可编辑的类似 GridView 的控件并使用它。让别人处理这个烂摊子。
其他请记住,您需要为它们提供不同的ID,并在每个Page_Init
中准确地在离开它们的位置重新创建它们。相同的 ID,控件树中的相同位置。当你完成这个操作时,你会注意到"添加"按钮的性能很糟糕,因为每次你按下它时它都会回发。理想情况下,您应该在客户端(也称为Javascript(添加其他文本框,而无需接触服务器。如果你这样做,那么你要么需要完全放弃整个控制范式,而是直接使用Request.Form
(至少对于这几个文本框(,要么你需要以某种方式在你的Page_Init
中找出添加多少个文本框在哪里,以便它们与客户端创建的内容相匹配。
所以......祝你好运!
变量名称仅在编译时可用。不能在运行时创建变量名称。相反,您应该使用数组或列表。