我在ListView中有一个PlaceHolder控件,用于从我的代码后面渲染控件。下面的代码添加了控件:
TextBox tb = new TextBox();
tb.Text = quest.Value;
tb.ID = quest.ShortName.Replace(" ", "");
((PlaceHolder)e.Item.FindControl("ph_QuestionInput")).Controls.Add(tb);
我使用以下代码检索已输入TextBox的值:
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中的控件时,它具有ClientID:
ctl00_cphContentMiddle_lv_Questions_ctrl0_ctl00
为什么要将Numberofacres更改为ctl00?有什么方法可以解决这个问题吗?
更新
为了澄清,我在Page_Init事件中数据绑定我的ListView。然后,我在ListView的ItemBound事件中创建控件。但是根据@Womp和MSDN的说法,控件实际上不会在Load事件(在Page_Init事件之后)之后创建,因此不在ViewState中?这听起来不错吗?
如果是这样的话,那么在从OnClick事件中检索动态控件中的值时,我只是SOL吗?
更新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
}
它解决了我的问题。仍然有点困惑,为什么我想要数据绑定,无论它是否是回发,但问题得到解决。
答案 0 :(得分:1)
看起来您正在将文本框添加到Placeholder
控件中......但随后您将在ListViewDataItem
容器中搜索它。
在我看来,您需要首先搜索占位符,然后搜索文本框。