0

我使用以下代码在页面加载中以编程方式创建了一个文本框:

HtmlTableRow row = new HtmlTableRow();
HtmlTableCell cell1 = new HtmlTableCell();
HtmlTableCell cell2 = new HtmlTableCell();
cell1.Controls.Add(new Label() { ID = LableID1, Text = Name });
cell2.Controls.Add(new TextBox() { ID = TextBoxID1 });
row.Cells.Add(cell1);
row.Cells.Add(cell2);
dynamictable.Rows.Add(row);

并且在按钮单击事件中,我试图从文本框中获取值并将该值分配给静态创建的另一个文本框,如下所示:

string id = TextBoxID1                       
TextBox tb = (TextBox)dynamictable.FindControl(id);                        
string valuetext = tb.Text;
TextBox1.Text = valuetext;

收到对象引用错误,我的意思是,我无法找到控件并创建 TextBox。

我也尝试按以下方法创建 TextBox:

TextBox tb = (TextBox)form1.FindControl(id);                        
TextBox tb = (TextBox)this.form1.FindControl(id);                        
TextBox tb = (TextBox)page.FindControl(id);  

任何帮助都会对我有很大帮助。

4

4 回答 4

0

为了使用动态控件,您需要完全了解ASP.Net 页面生命周期

动态控件需要在每个帖子上重新创建,负责为您创建动态控件的背后没有魔法,遗憾的是您必须明确创建它们。

请记住,页面只是一个类,它在您执行请求时创建,并在响应发送回用户时销毁。因此,每次都需要重新创建控件。这是在页面上静态声明控件时为您完成的。但是使用动态控件,您需要在每个帖子上重新创建它们

@BobTodd 提供的代码是一个很好的起点,但是 Microsoft 的建议是应该在Page_Init事件中创建动态控件,以便将它们的事件与其余的静态控件同步。

所以你的代码看起来像:

protected void Page_Init(object sender, EventArgs e)
{
 CreateTable();
}

现在,请记住这个简单的愚蠢规则,在使用动态控件时,始终使用相同的ID。这非常重要,因为页面视图状态是根据控件的 ID 加载回来的。

要考虑的另一件事是,在事件中创建的所有控件在页面上的每个控件上调用Init该方法之前都不会加载它们的视图状态。LoadViewState这意味着如果您订阅Page_PreLoadorPage_Load事件,您可以安全地设置控件的属性,因为它们的值已经从视图状态加载,因此您的新值不会被覆盖。

这意味着在PreLoad事件之前分配给控件的任何属性都将被页面 viewstate 值替换。因此,在加载视图状态后设置动态控件属性被认为是一种很好的做法。

作为快速查看,检查 ASP.Net 页面生命周期:

在此处输入图像描述

于 2012-08-10T06:26:32.413 回答
0

使用隐藏字段在java脚本中存储动态创建的文本框的值

还添加runat="server"隐藏字段

您可以从隐藏字段访问您的文本框值。

另一种方法是使用 javascript 将该值存储在查询字符串中,然后在后端读取它

于 2013-02-07T08:43:44.307 回答
0

我认为您可能需要先找到行,然后再找到单元格,然后再找到文本框。

意味着这样做:

TextBox tb = (TextBox)dynamictable.FindControl(id);   

您需要先找到特定的行,例如

// find by it or index etc
HtmlTableRow tb = (HtmlTableRow)dynamictable.FindControl(id);  

// Then find the Table cell and then find textbox..

我希望这能帮到您

于 2012-08-10T06:14:27.760 回答
0

您可能有一个创建表的方法,您需要在回发时调用它以确保一切都已设置。

protected HtmlTable dynamictable;
protected TextBox tb = new TextBox();


protected override void OnInit(EventArgs args)
{
 base.OnInit(args);
 CreateTableRows();
}

private void CreateTableRows()
{
 HtmlTableRow row = new HtmlTableRow();
 HtmlTableCell cell1 = new HtmlTableCell();
 HtmlTableCell cell2 = new HtmlTableCell();
 cell1.Controls.Add(new Label() { ID = LableID1, Text = Name });
 cell2.Controls.Add(tb });
 row.Cells.Add(cell1);
 row.Cells.Add(cell2);
 dynamictable.Rows.Add(row);
}

protected void OnClick(object sender, EventArgs args)
{
 return tb.Text;
}
于 2012-08-10T06:15:55.213 回答