题
我正在寻找一种方法,根据数据绑定项的属性,有选择地将CSS类应用于 GridView
中的各个行。
e.g:
GridView的数据源是 SummaryItems
的通用列表, SummaryItem
具有属性 ShouldHighlight
。当 ShouldHighlight == true
时,相关行的CSS应设置为突出显示
任何想法?
解决方案
非常容易
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对象,并且每行都填充了整个数据源......
P.S。参加查看本网站,您可以使用GridView对象找到几个项目教程
其他提示
您要记住的一件事是在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)
}
}