如何在GridView中实现条件格式

我的aspx页面上有一个GridView,它显示由以下类定义的对象集合

public class Item { public string ItemName{get; set;} public object ItemValue{get; set;} } 

然后在我的aspx标记中我有这样的东西

       

我想知道的是:
有没有办法在ItemValue字段上使用条件格式,这样如果对象持有字符串,它将返回不变的字符串,或者如果它保持DateTime,它将显示为DateTime.ToShortDateString()。

不确定是否可以使用BoundField,但如果将其更改为TemplateField,则可以使用此链接中的格式化函数。

即类似的东西

 <%# FormatDataValue(DataBinder.Eval(Container.DataItem,"ItemValue")) %> 

然后在您的代码隐藏中,您可以添加受保护的函数

 Protected Function FormatDataValue(val as object) As String 'custom enter code hereformatting goes here End Function 

或者您可以在gridview的OnRowCreated事件中执行某些操作,就像在此链接中一样

  

此函数是基于datavalue是否为null /为double的条件格式

 protected void OnRowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { DataRowView drv = e.Row.DataItem as DataRowView; Object ob = drv["ItemValue"]; if (!Convert.IsDBNull(ob) ) { double dVal = 0f; if (Double.TryParse(ob.ToString(), out dVal)) { if (dVal > 3f) { TableCell cell = e.Row.Cells[1]; cell.CssClass = "heavyrow"; cell.BackColor = System.Drawing.Color.Orange; } } } } } 

使用BoundField,您应该修改您的Item类。

如果你不想修改CodeBehind,那么你可以使用TemplateField做一些技巧:

            

显然你可以为任何类型的对象做到这一点,但也许你的“文本”字段会变得复杂..

顺便说一句..我的CodeBehind这个例子只是你的类Item和这个Page_Load():

  protected void Page_Load(object sender, EventArgs e) { Item i1 = new Item(); i1.ItemName = "name1"; i1.ItemValue = "foo"; Item i2 = new Item(); i2.ItemName = "name2"; i2.ItemValue = DateTime.Now; List list1 = new List(); list1.Add(i1); list1.Add(i2); MyTable.DataSource = list1; MyTable.DataBind(); } 

结果是正确的;)

我决定采用Paul Rowland解决方案,更多的是“if(e.Item.DataItem是DataRowView)”:

  if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) { if (e.Item.DataItem is DataRowView) { DataRowView rowView = (DataRowView)e.Item.DataItem; String state = rowView[PutYourColumnHere].ToString(); if (state.Equals("PutYourConditionHere")) { //your formating, in my case.... e.Item.CssClass = "someClass"; } } } 

在.NET 2.0中更容易:

将此方法添加到后面的代码中:(此示例将double值格式化为百万,带1位数)

 public string EvalAmount(string expression) { double? dbl = this.Eval(expression) as double?; return dbl.HasValue ? string.Format("{0:0.0}", (dbl.Value / 1000000D)) : string.Empty; } 

在aspx代码中,使用: