【问题标题】:How to use the FindControl function to find a dynamically generated control?如何使用 FindControl 函数查找动态生成的控件?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 我不知道 PlaceHolder 控件的内部工作原理,但我已经检查了您所说的内容,当我找到 PlaceHolder 控件时,它没有任何子控件。根据我发帖的最后 5 行,我假设 TextBox 控件在那里,但它的 id 已更改(从以 Numberofacres 结尾到以 ctl00 结尾)。
    • 您是否在每次回发时都以完全相同的方式重新创建文本框(以相同的顺序将它们添加到同一个容器中)?
    • 我只在!this.IsPostBack 时创建它们。我正在尝试检索在 OnClick 按钮事件中输入到这些控件中的任何值。
    • 如果您不在回发上创建动态控件,它们将不存在。这解释了为什么文本框为空。请记住,每个请求都会创建页面类的 new 实例,其中包含控件的 new 实例。您不能只创建一次动态控件,下次它们就不会出现了。
    • 是的,这是真的。你知道我将如何保留输入到动态控件中的值,以便我可以在我的 OnClick 事件中对它们做一些事情吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多