2009-03-19 14 views
5

Ho un GridView sulla mia pagina aspx che espone una collezione di oggetti definiti dalla seguente classeCome implementare la formattazione condizionale in un GridView

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

Poi nel mio aspx markup ho qualcosa di simile

<asp:GridView ID="MyTable" runat="server"> 
    <Columns> 
     <asp:BoundField DataField="ItemName" /> 
     <asp:BoundField DataField="ItemValue" /> 
    </Columns> 
</asp:GridView> 

quello che voglio sapere è:
c'è un modo per utilizzare la formattazione condizionale sul campo itemValue, in modo che se l'oggetto è in possesso di una stringa tornerà la stringa immutata, o se si tiene un DateTime verrà visualizzato come DateTime.ToShortDateString().

risposta

10

Non so se è possibile utilizzare un BoundField, ma se lo si modifica in un TemplateField è possibile utilizzare una funzione di formattazione come in this link.

vale a dire una cosa del genere

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

Poi, nel tuo codebehind, è possibile aggiungere una funzione protetta

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

Oppure si potrebbe fare qualcosa in caso OnRowCreated del GridView, come in this link

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

questa funzione è basata sulla formattazione condizionale se il valore dei dati è nullo/è un doppio

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

Con BoundField è necessario modificare la classe Item.

Se non si desidera modificare il vostro ther CodeBehind è una sorta di trucco si può fare utilizzando un 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> 

, ovviamente, si può fare per qualsiasi tipo di oggetto, ma forse il tuo "Testo" campo sarebbe diventato complicato .. ..

dal modo in cui .. il mio CodeBehind per questo esempio era solo te classe Item e questo 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(); 
    } 

e il risultato è stato corretto;)

0

In .NET 2.0 è ancora più semplice:

Aggiungi questo metodo per codice dietro: (questo esempio formatta un doppio valore milioni con 1 digit)

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; 
} 

Nel codice aspx, l'uso questo:

<asp:TemplateField ItemStyle-Width="100px"> 
    <ItemTemplate> 
     <asp:Label runat="server" Text='<%# EvalAmount("MyAmount") %>'></asp: 
    </ItemTemplate> 
</asp:TemplateField> 
1

ho deciso con la soluzione Paul Rowland e più una cosa "se (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"; 
     } 
     } 
    } 
Problemi correlati