如何使用FindControl函数查找动态生成的控件?

时间:2010-06-10 21:00:00

标签: asp.net

我在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
}

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

1 个答案:

答案 0 :(得分:1)

看起来您正在将文本框添加到Placeholder控件中......但随后您将在ListViewDataItem容器中搜索它。

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