在RowDataBound上添加CSS类

时间:2009-05-27 11:38:03

标签: asp.net

我正在尝试将一个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只是一个我正在进行比较的字符串。如果费用类型发生更改,那么我希望将边框应用于<tr>元素的底部。

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

3 个答案:

答案 0 :(得分:13)

在你的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...
        //
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分:-1)

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]可见。

希望这会有所帮助。