【发布时间】:2010-06-10 21:00:00
【问题描述】:
我在 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
}
它解决了我的问题。仍然有点困惑,为什么我要进行数据绑定,无论它是否是回发,但问题已解决。
【问题讨论】:
标签: asp.net