【问题标题】:Change value of databound control within Repeaters in C#在 C# 中的中继器中更改数据绑定控件的值
【发布时间】:2009-07-29 16:25:46
【问题描述】:

我有一个显示数据列表的嵌套转发器控件,在我的例子中它是一个常见问题列表。这是设计部分:

<asp:Repeater ID="lists" runat="server">
    <ItemTemplate>
        <h2 class="sf_listTitle"><asp:Literal ID="listTitle" runat="server"></asp:Literal></h2>

        <p class="sf_controlListItems">
            <a id="expandAll" runat="server">
                <asp:Literal ID="Literal1" runat="server" Text="<%$Resources:ExpandAll %>"></asp:Literal>
            </a>
            <a id="collapseAll" runat="server" style="display:none;">
                <asp:Literal ID="Literal2" runat="server" Text="<%$Resources:CollapseAll %>"></asp:Literal>
            </a>
        </p>

        <ul class="sf_expandableList" id="expandableList" runat="server">
            <asp:Repeater ID="listItems" runat="server">
                <HeaderTemplate>
                </HeaderTemplate>
                <ItemTemplate>
                    <li>
                        <h1 id="headlineContainer" runat="server" class="sf_listItemTitle">
                            <a id="headline" runat="server" title="<%$Resources:ClickToExpand %>"></a>
                        </h1>
                        <div id="contentContainer" runat="server" class="sf_listItemBody" style="display:none;">
                            <asp:Literal ID="content" runat="server"></asp:Literal>
                        </div>
                    </li>
                </ItemTemplate>
                <FooterTemplate>
                </FooterTemplate>
            </asp:Repeater>
        </ul>
    </ItemTemplate>
</asp:Repeater>

我感兴趣的中继器是第二个中继器listItems。在我的代码隐藏中,我无法直接调用 listItems 并查看其中的控件。我试图抓住list.DataBinding 内部的控件(也许我需要使用不同的事件?)方法:

void lists_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    var oRepeater = (Repeater) lists.FindControl("listItems");
}

但这会显示为null。谁能给我一些指示/提示我需要做什么才能访问listItems 中继器及其子控件?

谢谢!

【问题讨论】:

    标签: c# asp.net data-binding repeater


    【解决方案1】:
    lists
    

    属于每个RepeaterItem,不直接属于Repeater本身。

    试试:-

    void lists_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
    
    
        if ( e.Item.ItemType == ListItemType.AlternatingItem 
            || e.Item.ItemType == ListItemType.Item )
        {
           Repeater oRepeater = (Repeater)e.Item.FindControl("listItems");
    
           // And to get the stuff inside.
           foreach ( RepeaterItem myItem in oRepeater.Items )
           {
              if ( myItem.Item.ItemType == ListItemType.AlternatingItem 
                  || myItem.Item.ItemType == ListItemType.Item )  
              {
                 Literal myContent = (Literal)myItem.FindControl("content");
    
                 // Do Something Good!
                 myContent.Text = "Huzzah!";
    
              }
           }
        }
    }
    

    你应该很好:)

    经过编辑以纳入 DavidP 的有益改进。

    【讨论】:

    • 没有问题。一旦你了解了 ASP .NET 控件层次结构,它就很可爱 :)
    【解决方案2】:

    您需要将该行更改为

    var oRepeater = (Repeater) e.Item.FindControl("listItems");
    

    【讨论】:

    • 谢谢你,我完全忘记了哈哈。所以一旦我得到了这个 oRepeater,我如何得到控制字面量?
    • 认为我现在已经在我的回复中涵盖了您,先生 :)
    • Anders 您可以将属性 OnItemDataBinding="listItems_ItemDataBound" 添加到 listItems 转发器标记。您不需要遍历它的所有项目。
    【解决方案3】:

    你已经接近了!在您的事件处理程序中检查 RepeaterItemEventArgs 以了解您正在处理的行类型。您的子中继器将仅在 (Alt)Item 行上可用,而不是页眉或页脚。我的猜测是它在标题上爆炸了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-20
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多