如何从代码中访问图例标记

时间:2012-12-03 16:28:43

标签: c# asp.net html webforms repeater

我有以下数据绑定repeater代码:

<%--categories--%>
<asp:Repeater ID="CategoryRepeater" runat="server" OnItemDataBound="ItemBound">
    <ItemTemplate>
        <div class="groupbox">
            <fieldset>
                <legend><%# Container.DataItem %></legend>
                <table>
                    <asp:Repeater ID="ItemRepeater" runat="server">
                    <ItemTemplate>
                        <tr>
                        <td>
                            <asp:CheckBox id="chkItem" runat="server" Text='<%# Eval("Text")%>' />
                            <asp:HiddenField id="pgNos" runat="server" Value='<%# Eval("PGNos")%>' />
                            <asp:Button ID="btnXRefs" Text="x-refs" runat="server" CssClass="xRefButton" OnClick="btnSelectXRefs_Click" />
                        </td>
                        </tr>
                    </ItemTemplate>
                    </asp:Repeater>
                </table>
            </fieldset>
        </div>
    </ItemTemplate>
</asp:Repeater>

repeater内有一个repeater。如何从代码中访问legend<legend><%# Container.DataItem %></legend>)内的文字?

我试过了:

foreach (RepeaterItem cr in CategoryRepeater.Items)
{
string heading = (string) cr.DataItem; // returns null
}

2 个答案:

答案 0 :(得分:2)

Container.DataItem 是绑定列表中此特定项的DataItem的运行时别名。对于显示10行数据的 Repeater ,这是数据源中的一行...基本上,它是一个特定的行,在运行时,您可以从此行获取属性值

我看到你上面的 Mark Up ...好像你没有提到Data-Bound类型的属性,如下所示。

<%# ((Your Class Name)Container.DataItem).Class Property Name %>

  

转发器内有转发器。如何访问里面的文本   来自代码?

的图例(&lt;%#Container.DataItem%&gt;)

正如 phemt.latd 所述,您可以将图例标记更改为服务器端控件,如下所示。

<legend id="lg" runat="server">
      <%# ((Your Class Name)Container.DataItem).Class Property Name %>
</legend>

现在,在项目绑定数据事件中,找到图例控件。

protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || 
                           e.Item.ItemType == ListItemType.AlternatingItem)
    {
        HtmlGenericControl ctl = (HtmlGenericControl)e.Item.FindControl("lg");
        ctl.InnerText //This is what will give you the result.
    }
}

答案 1 :(得分:1)

您使用的图例标记在服务器端不可见。是客户端控件而不是服务器控件。

试试这个:

<legend id="myLegend" runat="server"><%# Container.DataItem %></legend>

然后在codebehind:

protected void ItemBound(Object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.DataItem == null) return;
        HtmlGenerics body = (HtmlGenerics)e.Item.FindControl("myLegend");
        body.InnerText = "Foo";
    }