2009-03-19 34 views
5

tengo un GridView en mi página aspx que muestra una colección de objetos definidos por la siguiente claseCómo aplicar formato condicional en un GridView

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

Luego, en mi marcado aspx tengo algo como esto

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

lo que yo quiero saber es:
¿hay una manera de utilizar el formato condicional en el campo ItemValue, por lo que si el objeto es la celebración de una cadena que devuelve la cadena sin cambios, o si se mantiene a DateTime se mostrará como DateTime.ToShortDateString().

Respuesta

10

No estoy seguro si puede usar un BoundField, pero si lo cambia a un TemplateField podría usar una función de formateo como en this link.

es decir, algo así como

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

Luego, en el código subyacente, puede agregar una función protegida

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

O usted podría hacer algo en caso OnRowCreated del gridview, como en this link

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

esta función está basada en el formato condicional si el valor de datos es nulo/es un doble

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 debe modificar su clase de Elemento.

Si no desea modificar su Ther CodeBehind es una especie de truco que puede hacer uso de 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> 

obviamente se puede hacer para cualquier tipo de objeto, pero tal vez su "texto" se convertiría en campo .. .. complicado

por cierto .. mi CodeBehind para este ejemplo era que la clase de artículos y esto 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(); 
    } 

y el resultado fue correcta;)

0

En .NET 2.0 es aún más fácil:

Añadir este método para codificar atrás: (este ejemplo da formato a un valor doble que millones con 1 dígito)

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

En el código aspx, el uso esto:

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

decidí con la solución Paul Rowland y más una cosa "si (e.Item.DataItem es 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"; 
     } 
     } 
    } 
Cuestiones relacionadas