Как реализовать условное форматирование в GridView - PullRequest
5 голосов
/ 19 марта 2009

У меня на странице 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 ().

Ответы [ 4 ]

10 голосов
/ 19 марта 2009

Не уверен, что вы можете использовать BoundField, но если вы измените его на TemplateField, вы можете использовать функцию форматирования, как в эта ссылка .

то есть что-то вроде

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

Затем в своем коде вы можете добавить Защищенную функцию

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

Или вы можете сделать что-то в событии OnRowCreated вида сетки, как в этой ссылке

<asp:GridView ID="ctlGridView" runat="server" OnRowCreated="OnRowCreated" />

эта функция является условным форматированием, основанным на том, является ли значение данных нулевым / двойным

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 голос
/ 11 февраля 2014

Я решил с помощью решения Пола Роуленда и еще одной вещи "if (e.Item.DataItem is 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";
         }
       }
     }
1 голос
/ 19 марта 2009

С 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();
    }

и результат был верным;)

0 голосов
/ 15 декабря 2010

В .NET 2.0 еще проще:

Добавьте этот метод к коду: (этот пример форматирует двойное значение как миллион с 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>
...