在ASP.NET Repeater中找不到控件?

26

我有下面这个重复器,我想在后台代码中找到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");

虽然m repeater包含1个itemtemplate,但Items为0。

5个回答

32

您需要设置属性 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");
}

我经常看到人们手动绑定内部重复项,并且他们没有意识到他们正在为自己制造多大的困难。


我猜一个简单的问题是,为什么当我有1个项目模板时返回0个项目? - Xaisoft
我不是很确定。我从来没有直接访问过重复器中的项目,所以我不确定它们的行为如何。 - Spencer Ruport
我有一些控件在重复器里面。每次发生回发(postback)时,我必须重新绑定(bind)它,然后才能访问这些控件。是否有一种方法可以调用ItemCreated函数来检索这些控件,而无需再次绑定? - Si8
@SiKni8 - 我无法告诉你。我已经很久没有使用ASP.Net Forms了,我不记得驱动这种事情的神奇行为了。 :( - Spencer Ruport
没关系,只是处理起来有点混乱。我手动填充了字段,这让生活变得更加轻松。谢谢 :) - Si8
显示剩余3条评论

8

我刚刚遇到了同样的问题。

在循环项时,我们缺少项类型。重复器中的第一个项目是标题,而标题没有我们正在寻找的 asp 元素。

请尝试以下方法:

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

谢谢,我有同样的问题,花了很多时间来解决它。 Stack Overflow 太棒了!! - Kamran
同感 - 这个例子本应该包含在MSDN自己的示例中...但是我们能指望什么呢? - Rich

2

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


0

你应该先绑定。
例如)

rptDetails.DataSource = dataSet.Tables["Order"];

rptDetails.DataBind();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接