我的aspx页面上有一个GridView,它显示由以下类定义的对象集合
public class Item
{
public string ItemName{get; set;}
public object ItemValue{get; set;}
}
然后在我的aspx标记中我有类似的东西
<asp:GridView ID="MyTable" runat="server">
<Columns>
<asp:BoundField DataField="ItemName" />
<asp:BoundField DataField="ItemValue" />
</Columns>
</asp:GridView>
我想知道的是:
有没有办法在ItemValue字段上使用条件格式,这样如果对象持有字符串,它将返回不变的字符串,或者如果它持有DateTime,它将显示为DateTime.ToShortDateString()。 < / p>
答案 0 :(得分:10)
不确定您是否可以使用BoundField,但如果将其更改为TemplateField,则可以使用this link中的格式化函数。
即
之类的东西<%# FormatDataValue(DataBinder.Eval(Container.DataItem,"ItemValue")) %>
然后在您的代码隐藏中,您可以添加受保护的函数
Protected Function FormatDataValue(val as object) As String
'custom enter code hereformatting goes here
End Function
或者您可以在gridview的OnRowCreated事件中执行某些操作,例如this link
<asp:GridView ID="ctlGridView" runat="server" OnRowCreated="OnRowCreated" />
此函数是基于datavalue是否为null /是双重
的条件格式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;
}
}
}
}
}
答案 1 :(得分:1)
使用BoundField,您应该修改您的Item类。
如果您不想修改CodeBehind,那么您可以使用TemplateField进行操作:
<asp:GridView ID="MyTable" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="ItemName" HeaderText="Name" />
<asp:TemplateField HeaderText="Value">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# ((Eval("ItemValue") is DateTime) ? ((DateTime)Eval("ItemValue")).ToShortDateString() : Eval("ItemValue")) %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
显然你可以为任何类型的对象做这件事,但也许你的“文本”字段会变得复杂..
顺便说一下..我的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<Item> list1 = new List<Item>();
list1.Add(i1);
list1.Add(i2);
MyTable.DataSource = list1;
MyTable.DataBind();
}
,结果是正确的;)
答案 2 :(得分:1)
我决定采用Paul Rowland解决方案,更多一件事“如果(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";
}
}
}
答案 3 :(得分:0)
在.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代码中,使用:
<asp:TemplateField ItemStyle-Width="100px">
<ItemTemplate>
<asp:Label runat="server" Text='<%# EvalAmount("MyAmount") %>'></asp:
</ItemTemplate>
</asp:TemplateField>