2009-03-19 7 views
5

J'ai un GridView sur ma page ASPX qui affiche une collection d'objets définis par la classe suivanteComment mettre en œuvre la mise en forme conditionnelle dans un GridView

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

Puis dans mon balisage ASPX j'ai quelque chose comme ça

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

ce que je veux savoir est:
est-il possible d'utiliser la mise en forme conditionnelle sur le terrain ItemValue, de sorte que si l'objet tient une chaîne, elle retourne la chaîne inchangée ou si elle détient un DateTime il s'affichera comme DateTime.ToShortDateString().

Répondre

10

Vous ne savez pas si vous pouvez utiliser un BoundField, mais si vous le changez en TemplateField, vous pouvez utiliser une fonction de formatage comme dans this link.

-à-dire quelque chose comme

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

Ensuite, dans votre behind, vous pouvez ajouter une fonction protégée

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

Ou vous pourriez faire quelque chose en cas OnRowCreated du gridview, comme dans this link

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

cette fonction est basée sur la mise en forme conditionnelle sur si la valeur de données est nulle ou est un double

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

Avec BoundField, vous devez modifier votre classe d'élément.

Si vous ne voulez pas modifier votre ther CodeBehind est une sorte de truc que vous pouvez le faire en utilisant 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> 

vous pouvez évidemment le faire pour tout type d'objet, mais peut-être votre « Texte » champ deviendrait .. compliqué ..

par la voie .. mon CodeBehind pour cet exemple était vous élément de classe et ce 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(); 
    } 

et le résultat était correct;)

0

Dans .NET 2.0 est encore plus facile:

Ajouter cette méthode à code-behind: (cet exemple formate une double valeur millions à 1 chiffre)

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

Dans le code ASPX, l'utilisation ceci:

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

j'ai décidé avec la solution Paul Rowland et plus une chose "si (e.Item.DataItem est 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"; 
     } 
     } 
    } 
Questions connexes