17

GridView我正在寻找一种方法来根据数据绑定项的属性有选择地将 CSS 类应用于单个行。

例如:

GridView 的数据源是一个通用列表,SummaryItems具有SummaryItem一个属性ShouldHighlight。当ShouldHighlight == true关联行的 CSS 应设置为highlighted

有任何想法吗?

4

2 回答 2

25

好简单

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataRowView drv = e.Row.DataItem as DataRowView;
        if (drv["ShouldHighlight"].ToString().ToLower() == "true")
            e.Row.CssClass = "highlighted";
    }
}

如果您使用DataTable 作为 DataSource ,则上面的代码有效

改成:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        myClass drv = (myClass)e.Row.DataItem;
        if (drv.ShouldHighlight)
            e.Row.CssClass = "highlighted";
    }
}

仅适用于上面使用泛型时的示例:

public class myClass
{ 
    public Boolean ShouldHighlight
    { get; set; }
}

如果您正在使用泛型(列表、字典等)

记住:

e.Row.dataItem

始终返回填充行的整个对象,因此很容易从这里操作网页中数据的外观。

您应该使用 RowDataBound 事件,该事件将在数据附加到行对象但尚未在页面中编写 HTML 代码后触发,这样您可以检查 ShouldHighlight 值(我转换为字符串,因为我不知道类型,如果你知道它是一个布尔值,你可以改变它)。

此代码比 megakemp 代码运行得快得多,因为您没有创建 List 对象并为每一行填充整个数据源......

PS看看这个网站,你可以找到几个使用 GridView 对象的项目教程

于 2008-10-16T10:44:26.947 回答
7

您要记住的一件事是,在 RowCreated 或 RowDataBound 事件处理程序中设置 Row.CssClass 属性将覆盖您可能在网格级别应用的任何默认样式。GridView 使您可以通过以下属性轻松访问行样式:

gvGrid.AlternatingRowStyle.CssClass = ALTROW_CSSCLASS
gvGrid.RowStyle.CssClass = ROW_CSSCLASS

但是,当您将 CssClass 值分配给特定行时,正如您在这种情况下的需要,分配会覆盖网格级别的任何顶级分配。分配不会像我们希望的那样“级联”。因此,如果您想保留顶级班级分配并自己分层,更具体的一个,那么您需要检查 rowState 以查看您正在处理哪种行并相应地连接您的班级名称

If(item.ShouldHighlight)
 {
    If(e.Row.RowState == DataControlRowState.Alternate)
    {
        e.Row.CssClass = String.Format("{0} {1}", "highlight", ALTROW_CSSCLASS)
    }
    else
    {
        e.Row.CssClass = String.Format("{0} {1}", "highlight", ROW_CSSCLASS)
    }


}
于 2008-11-24T20:08:28.850 回答