GridView
我正在寻找一种方法来根据数据绑定项的属性有选择地将 CSS 类应用于单个行。
例如:
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 作为 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 对象的项目教程
您要记住的一件事是,在 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)
}
}