【发布时间】:2010-09-17 12:10:02
【问题描述】:
我正在寻找一种方法,根据数据绑定项的属性有选择地将 CSS 类应用于 GridView 中的各个行。
例如:
GridView 的数据源是SummaryItems 的通用列表,SummaryItem 有一个属性ShouldHighlight。当 ShouldHighlight == true 时,关联行的 CSS 应设置为 highlighted
有什么想法吗?
【问题讨论】:
我正在寻找一种方法,根据数据绑定项的属性有选择地将 CSS 类应用于 GridView 中的各个行。
例如:
GridView 的数据源是SummaryItems 的通用列表,SummaryItem 有一个属性ShouldHighlight。当 ShouldHighlight == true 时,关联行的 CSS 应设置为 highlighted
有什么想法吗?
【问题讨论】:
很简单
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 作为数据源
,上面的代码可以工作改为:
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 对象并为每一行填充整个数据源...
附注采取look at this website,您可以使用 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)
}
}
【讨论】: