如何在GridView中实现条件格式

时间:2009-03-19 10:22:08

标签: c# .net gridview asp.net-2.0

我的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>

4 个答案:

答案 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>