【问题标题】:Can't find control within asp.net repeater?在 asp.net 中继器中找不到控件?
【发布时间】:2009-07-29 22:01:16
【问题描述】:

我在下面有以下转发器,我试图在后面的代码中找到 lblA,但它失败了。标记下方是我所做的尝试:

<asp:Repeater ID="rptDetails" runat="server">
    <HeaderTemplate>
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><strong>A:</strong></td>
            <td><asp:Label ID="lblA" runat="server"></asp:Label>
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>
</table>

首先我尝试过,

Label lblA = (Label)rptDetails.FindControl("lblA");

但 lblA 为空

然后我尝试了,

Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");

但 Items 为 0,即使 m 中继器包含 1 个 itemtemplate

【问题讨论】:

    标签: c# asp.net repeater


    【解决方案1】:

    需要设置属性OnItemDataBound="myFunction"

    然后在您的代码中执行以下操作

    void myFunction(object sender, RepeaterItemEventArgs e)
    {
       Label lblA = (Label)e.Item.FindControl("lblA");
    }
    

    顺便说一句,您可以对嵌套中继器使用完全相同的方法。即:

    <asp:Repeater ID="outerRepeater" runat="server" OnItemDataBound="outerFunction">
    <ItemTemplate>
       <asp:Repeater ID="innerRepeater" runat="server" OnItemDataBound="innerFunction">
       <ItemTemplate><asp:Label ID="myLabel" runat="server" /></ItemTemplate>
       </asp:Repeater>
    </ItemTemplate>
    </asp:Repeater>
    

    然后在你的代码中:

    void outerFunction(object sender, RepeaterItemEventArgs e)
    {
       Repeater innerRepeater = (Repeater)e.Item.FindControl("innerRepeater");
       innerRepeater.DataSource = ... // Some data source
       innerRepeater.DataBind();
    }
    void innerFunction(object sender, RepeaterItemEventArgs e)
    {
       Label myLabel = (Label)e.Item.FindControl("myLabel");
    }
    

    我经常看到人们在内部中继器上手动绑定项目,但他们没有意识到自己为自己制作东西有多么困难。

    【讨论】:

    • 我有点困惑。我实际上在做的是,当我单击一页上的查看详细信息链接时,它会将我带到另一个具有转发器的页面上的详细视图,并且在 page_load 中,我试图找到 lblA
    • 已编辑。希望这能解释更多。
    • 好的,我最终做的是将一个 DataTable 变量移动到类的顶层。然后我创建了 ItemDataBoundEvent 并在其中检查了转发器中的 lblA,如果找到它,请将其设置为我从 DataTable 中的一行返回的一些文本。我对此的理解是否正确?谢谢
    • 我想一个简单的问题是,为什么我有 1 个项目模板时返回 0 个项目?
    • 我不太确定。我从不直接在中继器中访问项目,所以我不确定它们的行为方式。
    【解决方案2】:

    我也遇到了同样的问题。

    在项目中循环时,我们缺少 项目类型。转发器中的第一项是 header,而 header 没有我们要查找的 asp 元素。

    试试这个:

    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");}
    

    【讨论】:

    • 谢谢,我也遇到了同样的问题,我花了很多时间来解决问题。太好了!!
    • 同上 - 这确实应该包含在 MSDN 自己的示例中......但是我们应该从中期待什么呢??
    【解决方案3】:

    VB.net 代码

        Protected Sub rptDetails_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptDetails.ItemDataBound    
          If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
            Dim lblA As Label = CType(e.Item.FindControl("lblA"), Label)
            lblA.Text = "Found it!"
          End If
        End Sub
    

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

        你应该先绑定。
        例如)

        rptDetails.DataSource = dataSet.Tables["Order"];
        
        rptDetails.DataBind();
        

        【讨论】:

          猜你喜欢
          • 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
          相关资源
          最近更新 更多