【问题标题】:Adding CSS Class on RowDataBound在 RowDataBound 上添加 CSS 类
【发布时间】:2009-05-27 21:47:43
【问题描述】:

我正在尝试将 CSS 类附加到 RowDataBound 上的一行。我正在对 GridView 使用交替的 css 类属性,所以我假设这应用于 RowDataBound。如果您以编程方式将 CSS 类分配给 RowDataBound 事件中行的 CssClass 属性,则不会应用交替行样式 css 类,即使您附加了 CSS 类

这是我得到的:

Protected Sub gvGeneral_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvGeneral.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
      If previousExpenseType <> e.Row.Cells(2).Text And previousExpenseType.Length > 0 Then
        e.Row.CssClass += "bottom-border"
      End If

      previousExpenseType = e.Row.Cells(2).Text
    End If
  End Sub

previousExpenseType 只是一个字符串,我正在对其进行比较。如果费用类型发生变化,那么我希望在&lt;tr&gt; 元素的底部应用边框。

任何想法如何解决这个问题?在 RowDataBound 之后似乎有一个事件将交替行样式 css 类应用于行。

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    在您的 RowDataBound 事件处理程序中尝试此操作...

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        GridView grid = GridView1;
        GridViewRow row = e.Row;
        if (row.RowType == DataControlRowType.DataRow)
        {
            bool isAlternating = row.RowState == DataControlRowState.Alternate;
    
            List<string> classes = new List<string>();
    
            /*  Setting the CssClass of a row overwrites any CssClass declared in the 
             *  markup, so lets save the value that is in the markup and add to it.
             */
            if (isAlternating) { classes.Add(grid.AlternatingRowStyle.CssClass); }
            else { classes.Add(grid.RowStyle.CssClass); }
    
            //
            //logic for adding other css classes to the row...
            //
    
            //set the CssClass property of the row to the combined css classes value
            row.CssClass = string.Join(" ", classes.ToArray());
    
            //
            //more row processing...
            //
        }
    }
    

    【讨论】:

    • 您可能想改用row.RowState.HasFlag(DataControlRowState.Alternate),因为DataControlRowStateFlags enum。可能.net框架从那以后发生了变化,至少在VS2010/.net 4中添加了HasFlag
    【解决方案2】:

    您可能想要尝试的另一种解决方法是在所有行都数据绑定后执行检查和 CSS 类操作,方法是使用后面的 gridview 事件之一并自己循环遍历行。我知道这会增加一些额外的处理时间,但根据您显示的数据集的大小,这可能是值得的。

    【讨论】:

    • 是的,这就是我不希望听到的,但这似乎是目前最可行的解决方案。
    • 我明白了。绝对不是理想的,但如果你所说的关于一个可能的隐藏事件覆盖你正在做的事情是真的,我真的想不出很多方法来规避它而不是 a) 摆脱项目样式和替代的任何规则行样式(不需要)或b)四处走动并做事后需要做的事情。
    【解决方案3】:

    Gridview rowdatabound 只允许您在 TR 中操作 HTML,因此您可能无法选择使用 gridView 执行您想要执行的操作。相反,我建议使用Repeater,它可以让您更好地控制您生成的HTML。这是你可以用中继器做的事情

    <table>
        <thead>
            <tr><td>Head1</td><td>Head2</td></tr>
        </thead>
        <asp:Repeater ID="rptTaskItems" runat="server">
            <ItemTemplate>
                 <tr><td>column 1 data</td>
                     <td>column 1 data</td>
                 </tr>
                 <asp:PlaceHolder ID="PHBar" runat="server" visible="false">
                 <tr><td colspan="2"><hr/></td>
                 </tr>
                 </asp:PlaceHolder>
            </ItemTemplate>
        </asp:Repeater>
    </table>
    

    在 ItemDataBound 中,您可以使这个占位符 [PHBar] 仅在您的条件为真时才可见,仅此而已。

    希望这会有所帮助。

    【讨论】:

    • 我不确定您对此的立场。 CssClass 属性确实有效,我的问题是在 RowDataBound 之后发生的隐藏事件不会附加交替的 CSS 类。我正在应用一个 CSS 类,因此我正在操作 HTML。
    • Kez 好像有点苛刻 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多