如何在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代码中,使用: