我有一个ListView中的PlaceHolder控件,用于从我的代码后面呈现控件。下面的代码添加控件:如何使用FindControl函数查找动态生成的控件?
TextBox tb = new TextBox();
tb.Text = quest.Value;
tb.ID = quest.ShortName.Replace(" ", "");
((PlaceHolder)e.Item.FindControl("ph_QuestionInput")).Controls.Add(tb);
我使用下面的代码来获取已经输入到文本框的值:
foreach (ListViewDataItem di in lv_Questions.Items)
{
int QuestionId = Convert.ToInt32(((HiddenField)di.FindControl("hf_QuestionId")).Value);
Question quest = dc.Questions.Single(q => q.QuestionId == QuestionId);
TextBox tb = ((TextBox)di.FindControl(quest.ShortName.Replace(" ","")));
//tb is always null!
}
但它从来没有找到控制。我看过的网页,我想控制的源代码有ID:
ctl00_cphContentMiddle_lv_Questions_ctrl0_Numberofacres
出于某种原因,当我看到在ListViewDataItem的控件它具有客户端ID:
ctl00_cphContentMiddle_lv_Questions_ctrl0_ctl00
为什么它会将Numberofacres更改为ctl00?有什么办法可以解决这个问题吗?
UPDATE:
只是为了澄清,我正在我的数据绑定的ListView在Page_Init事件。然后,我为我的ListView在ItemBound事件中创建控件。但是根据@Womp和MSDN的说法,这些控件直到Load事件(在Page_Init事件之后)之后才会真正创建,因此不在ViewState中?这听起来正确吗?
如果是这样,我只是SOL当涉及到从我的OnClick事件中检索动态控件中的值时?
更新2:
所以我改变了代码,我在我的Page_Init事件来源:
protected void Page_Init(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
//databind lv_Questions
}
}
到:
protected void Page_Init(object sender, EventArgs e)
{
//databind lv_Questions
}
它固定我的问题。仍然有点困惑,为什么我想要数据绑定,无论是否是回发,但问题已解决。
我不知道PlaceHolder控件的内部工作原理,但我检查了你在说什么,并且当我找到PlaceHolder控件时,它没有任何子控件。基于我发布的最后5行,我假设TextBox控件存在,但它的id已更改(从Numberofacres结束到以ctl00结尾)。 – 2010-06-10 21:13:22
您是否在每次回发中以完全相同的方式重新创建文本框(将它们添加到相同的容器中,以相同的顺序)? – womp 2010-06-10 21:27:56
我只在'!this.IsPostBack'创建它们。我试图在OnClick按钮事件中检索输入到这些控件中的任何值。 – 2010-06-10 21:40:02