无法从动态创建的文本框中获取值

时间:2012-08-10 06:07:32

标签: c# asp.net

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

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);

在按钮单击事件中,我试图从文本框中获取值,并将该值分配给anohter TextBox,该文件框静态创建如下:

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 个答案:

答案 0 :(得分: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..

我希望这会对你有所帮助

答案 1 :(得分: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;
}

答案 2 :(得分:0)

要使用动态控件,您需要完全理解ASP.Net Page Life-cycle

需要在每个帖子上重新创建动态控件 ,为您创建动态控件的责任毫无魔力,遗憾的是您必须明确创建它们。

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

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

所以你的代码看起来像是:

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

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

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

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

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

enter image description here

答案 3 :(得分:0)

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

还在隐藏的费用中添加runat="server"

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

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