【问题标题】:ASP.NET ListView Alternating GroupsASP.NET ListView 交替组
【发布时间】:2010-11-03 07:47:47
【问题描述】:

与大多数数据绑定的 ASP.NET 控件一样,ASP.NET ListView 控件具有一个 AlternatingItemTemplate,例如,您可以使用它来为奇数行和偶数行呈现不同的 css 类。该控件还具有 GroupTemplate,您可以使用它来对项目进行分组并显示例如 TD 中的 3 个项目,这些项目在 TR 中分组。但是,没有交替组模板。我的问题是如何在 GroupTemplate 中替换 tr 的类属性。基本上我想在一个 TR 中有 3 个项目,并在奇数和偶数 TRs 上交替使用样式。

我想避免将一个数据绑定控件嵌套在另一个控件中,并且我已经尝试在数据绑定表达式<%# Alternate() %> 中绑定 TR 的类,但似乎数据绑定表达式仅在 itemtemplate 中调用(显然它们用于数据绑定事件,组模板不调用它)

有什么想法吗?

示例代码:

    <asp:ListView ID="lv1" runat="server" EnableViewState="false" GroupItemCount="3">
    <LayoutTemplate>
        <table class="asd">
            <asp:PlaceHolder ID="groupPlaceholder" runat="server"></asp:PlaceHolder>
        </table>
    </LayoutTemplate>
    <GroupTemplate>
        <tr class='<%# GetAlternatingCssClass() %>'>
            <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
        </tr>
    </GroupTemplate>
    <ItemTemplate>
        <td>
            <asp:HyperLink runat="server" NavigateUrl='<%# Eval("Url") %>'> <%# Eval("Text") %> </asp:HyperLink>
        </td>
    </ItemTemplate>
</asp:ListView>

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    【讨论】:

    • 酷!我正在考虑覆盖默认行为,但没想到会这么容易
    【解决方案2】:

    首先:

    <GroupTemplate>
        <tr class='<%# GetAlternatingCssClass() %>'>
            <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder>
        </tr>
    </GroupTemplate>
    

    只会在处理页面时对 ListView 进行一次评估,而不是在每次访问元素时进行评估。要按照此处的预期实现这一点,我认为您需要覆盖 ListView 的 Render 方法,以根据 GroupItemCount 替换类。我没有对此进行编码,所以这是假设。

    GroupTemplate 旨在提供一种流程布局,其中每个项目都是一个自包含的元素,即完整的产品列表,并且项目和行没有连接(就像表示字段的行中的单元格一样)在记录中)。因此,交替行颜色对数据表示没有任何帮助,而纯粹是为了美观(并且可能会使习惯于以这种方式识别不同记录的用户感到困惑,这可能会导致他们对实际上不存在的数据关系进行推断) .

    我认为你必须做很多工作才能从基本的 ListView 中得到你想要的东西,我认为要问自己的第一个问题是你为什么想要这个,它是用户要求还是你的要求基于美学(这本身并没有错,但您欣赏控件是为功能而不是美学设计的)。如果这不是用户要求,他们是否愿意为解决此问题的努力付费?

    【讨论】:

    • 实际上我想为我们可以在项目中随处使用的表创建一个模板控件。我可以在代码中轻松地做到这一点,但我希望我们的设计人员能够在不查看 C# 代码的情况下修改控件、附加脚本等,这就是我打算使用 ListView 的原因。我可能会在控件中包装一个 DataPager。很可能我们会将表格包装在 UpdatePanel 中,并为 ajax 调用放置一些加载通知。在我看来,使用 ASP.NET 控件并公开它们的功能而不是从头开始创建整个控件会更容易。我错了吗?
    • 您可以使用标准 ASP.NET 控件创建一个用户控件,公开一些属性并提供它。它可能会提供您正在寻找的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多