我改变了我的问题,因为它可能不被理解。也很抱歉我的英文...
动态创建将它们放在数组中的TextBox。
我的一段代码:
public partial class NewArticleForm : System.Web.UI.Page
{
private Label[] lblName;
private TextBox[] txtName;
private Label[] lblSurname;
private TextBox[] txtSurname;
private PlaceHolder PlaceHolder1;
public int NumberOfOtherAuthors()
{
Int32 index = Convert.ToInt32(NumberList.SelectedValue);
return index;
}
public void dataofOtherAuthor()
{
int authors;
int i = 0;
int j=1
authors = NumberOfOtherAuthors();
lblName = new Label[authors];
txtName = new TextBox[authors];
lblSurname = new Label[authors];
txtSurname = new TextBox[authors];
PlaceHolder1 = new PlaceHolder();
for (i = 0; i < authors; i++)
{
Label authorInformation = new Label();
authorInformation.Text = "Information for Author " + j.ToString() + " :";
lblName[i] = new Label();
lblName[i].Text = "Name:";
txtName[i] = new TextBox();
lblSurname[i] = new Label();
lblSurname[i].Text = "Surname:";
txtSurname[i] = new TextBox();
PlaceHolder1.Controls.Add(authorInformation);
PlaceHolder1.Controls.Add(lblName[i]);
PlaceHolder1.Controls.Add(txtName[i]);
PlaceHolder1.Controls.Add(lblSurname[i]);
PlaceHolder1.Controls.Add(txtSurname[i]);
// Add a spacer in the form of an HTML <BR> element.
Panel1.Controls.Add(PlaceHolder1);
j++; } }
protected void NumberList_SelectedIndexChanged(object sender, EventArgs e)
{
dataofOtherAuthor();
}
private void UploadForm()
{
int numberOfOtherAuthors = NumberOfOtherAuthors();
int i=0;
for (i = 0; i < numberOfOtherAuthors; i++)
{
Label1.Text = txtName[i].Text;
}
}
protected void btnUpload_Click(object sender, EventArgs e)
{
UploadForm();
}
}
如何获取文本框的值? 具体来说,我想在数据库中传递数据。如果我得到了值,那么Label就是一个测试。
谢谢!!!
答案 0 :(得分:1)
不确定您是否知道,但是您在for循环的每次迭代中都将PlaceHolder1
放在Panel1
中。也许你打算在for循环后做Panel1.Controls.Add(PlaceHolder1);
?
无论如何,您已将这些TextBox控件放入表单中。如果您尝试通过回发访问它们,则需要通过它们的集ID
访问它们,或者通过它们的asp容器访问它们(同时设置runat="server"
):
x = (p1.Controls[placeHolderIndex].Controls[textBoxIndex] as TextBox).Text;
或者你可以试试
x = (p1.FindControl("placeHolder_ID").FindControl("textBox_ID") as TextBox).Text;
再次确保它们都是runat="server"
txtName
在回发后不会保留其值。
让你的第二个循环做一些比覆盖set字符串更有用的东西;也许可以将每个值添加到List
List<string> x = new List<string>();
for (i = 0; i < authors; i++)
{
x.Add((p1.Controls[placeHolderIndex].Controls[i] as TextBox).Text);
//increment placeHolderIndex if you don't change your design
}
答案 1 :(得分:1)
引用:
txtName = new TextBox[authors];
int authors = 5;
您在创建数组后声明authors
,因此您的错误显示authors
尚不存在,之后txtName不存在(因为它未正确实例化)。将其更改为:
int authors = 5;
txtName = new TextBox[authors];
另外,为了正确起见,请将String
更改为string
,
应该这样做
答案 2 :(得分:0)
你需要在足够早的时间(通常是OnInit)添加控件,以便控件正确地从帖子中获取值。
的OnInit:
Form1.Controls.Add(myTextbox);
的Page_Load:
var text = myTextbox.Text;
查看HOW TO: Dynamically Create Controls in ASP.NET by Using Visual C# .NET或许多其他有关“ASP.Net如何添加动态控件”搜索条件的解释。
答案 3 :(得分:0)
要检索占位符中的控件,请使用Placeholder1.FindControl("
[控件名称] ")
。
您可能希望在创建控件时将控件命名为唯一且可引用的控件。
或者,如果您知道控件的索引,则可以使用Placeholder1.Controls(
[索引] )
引用它们。
答案 4 :(得分:0)
我使用不同的方法创建了对象,我称之为txtName[i]
,这是我的问题。
public void dataofOtherAuthor()
{
...
txtName[i] = new TextBox();
...}
private void UploadForm()
{
...
Label1.Text = txtName[i].Text;
...
}