如何在asp.net中访问动态创建的服务器控件

我创建了一个网页,我曾经动态地将服务器端控件添加到表中。

我分别为他们分配了ID ..但我无法访问这些动态创建的服务器控件。

C#代码:

protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { int num_row = (int)Session["No_of_Rows"]; for (int i = 2; i < num_row; i++) { TableRow row = new TableRow(); TableCell cell1 = new TableCell(); TableCell cell2 = new TableCell(); TextBox tb = new TextBox(); CheckBox cb = new CheckBox(); row.ID = "rw" + i; cell1.ID = "c" + i + "1"; cell2.ID = "c" + i + "2"; tb.ID = "txt" + i; tb.EnableViewState = true; cb.ID = "chk" + i; cell1.Controls.Add(cb); cell2.Controls.Add(tb); row.Cells.Add(cell1); row.Cells.Add(cell2); tbl.Rows.Add(row); } } else { Session["No_of_Rows"] = 2; } } protected void addRow(object sender, EventArgs e) { int num_row = (int)Session["No_of_Rows"] + 1; TableRow row = new TableRow(); TableCell cell1 = new TableCell(); TableCell cell2 = new TableCell(); TextBox tb = new TextBox(); CheckBox cb = new CheckBox(); row.ID = "rw" + num_row; cell1.ID = "c" + num_row + "1"; cell2.ID = "c" + num_row + "2"; tb.ID = "txt" + num_row; //tb.EnableViewState = true; cb.ID = "chk" + num_row; cell1.Controls.Add(cb); cell2.Controls.Add(tb); row.Cells.Add(cell1); row.Cells.Add(cell2); tbl.Rows.Add(row); Session["No_of_Rows"] = tbl.Rows.Count; } protected void btnSubmit_Click(object sender, EventArgs e) { TextBox tb = new TextBox(); int num_row = Convert.ToInt16(tbl.Rows.Count); for (int i = 1; i < num_row; i++) { string tstr = "txt" + i; tb = (TextBox)this.FindControl(tstr); } Label1.Text = tb.Text; } 

asp代码:

  

请帮助我。

为了测试你的场景,我添加了2个控件txtOutput和Getvalues按钮。除了你的控件ID从0开始,你的for循环从1开始,一切似乎都没问题。

但是,这不应该在FindControl中返回null。

我怀疑你的表id是不正确的,因为在你引用的另一篇文章中,表id是“tbl”。

其他明智的一切似乎都是正确的。 无论如何,我已经粘贴了我在这里试过的代码,并且它有效。

您将获得错误的另一种可能性是,即使它们是在Page_Load中创建的,您也会尝试访问控件。 但是,因为您的表中有2行静态,所以无论动态控件创建如何,您的代码都应该正常工作。 请尝试以下代码并更新

 

//后面的代码从这里开始

  public partial class DynamicControl : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { int num_row = (int)Session["No_of_Rows"]; for (int i = 2; i < num_row; i++) { TableRow row = new TableRow(); TableCell cell1 = new TableCell(); TableCell cell2 = new TableCell(); TextBox tb = new TextBox(); CheckBox cb = new CheckBox(); row.ID = "rw" + i; cell1.ID = "c" + i + "1"; cell2.ID = "c" + i + "2"; tb.ID = "txt" + i; tb.EnableViewState = true; cb.ID = "chk" + i; cell1.Controls.Add(cb); cell2.Controls.Add(tb); row.Cells.Add(cell1); row.Cells.Add(cell2); tbl.Rows.Add(row); } } else { Session["No_of_Rows"] = 2; } } protected void addRow(object sender, EventArgs e) { int num_row = (int)Session["No_of_Rows"]; TableRow row = new TableRow(); TableCell cell1 = new TableCell(); TableCell cell2 = new TableCell(); TextBox tb = new TextBox(); CheckBox cb = new CheckBox(); row.ID = "rw" + num_row; cell1.ID = "c" + num_row + "1"; cell2.ID = "c" + num_row + "2"; tb.ID = "txt" + num_row; tb.EnableViewState = true; cb.ID = "chk" + num_row; cell1.Controls.Add(cb); cell2.Controls.Add(tb); row.Cells.Add(cell1); row.Cells.Add(cell2); tbl.Rows.Add(row); Session["No_of_Rows"] = tbl.Rows.Count; } protected void GetValuesfromDynamicControls(object sender, EventArgs e) { //int rows =Convert.ToInt32( Session["No_of_Rows"]); int rows = Convert.ToInt32(tbl.Rows.Count); StringBuilder sb = new StringBuilder(); for (int i = 0; i < rows; i++) { TextBox tb =(TextBox) Page.FindControl("txt" + i); sb.Append(tb.Text + ";"); } txtOutput.Text = sb.ToString(); } } 

在每个回发后,动态创建的控件可能不可见。 因此,您需要在每个post上重新创建动态控件。然后您可以访问这些控件。

你可以这样做:

 TextBox txt= (TextBox)FindControl("txt"+i.Tostring()); string txtValue=txt.Text; 

并访问for循环中的所有文本框:

 int num_row = Convert.ToInt16(sometable.Rows.Count); for (int i = 1; i < num_row; i++) { string txtID="txt" + i.Tostring(); TextBox txt= (TextBox)FindControl(txtID); string txtValue=txt.Text; } 

尝试:

  tb = (TextBox)sometable.FindControl("txt" + i);