2010-06-10 76 views
0

我有一个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 
} 

它固定我的问题。仍然有点困惑,为什么我想要数据绑定,无论是否是回发,但问题已解决。

回答

1

它看起来像你将你的文本框添加到一个Placeholder控制...但后来你正在搜索一个ListViewDataItem容器。

在我看来,您需要首先搜索占位符,然后搜索文本框。

+0

我不知道PlaceHolder控件的内部工作原理,但我检查了你在说什么,并且当我找到PlaceHolder控件时,它没有任何子控件。基于我发布的最后5行,我假设TextBox控件存在,但它的id已更改(从Numberofacres结束到以ctl00结尾)。 – 2010-06-10 21:13:22

+0

您是否在每次回发中以完全相同的方式重新创建文本框(将它们添加到相同的容器中,以相同的顺序)? – womp 2010-06-10 21:27:56

+0

我只在'!this.IsPostBack'创建它们。我试图在OnClick按钮事件中检索输入到这些控件中的任何值。 – 2010-06-10 21:40:02