2009-03-19 18 views
5

Tôi có một GridView trên trang aspx của tôi hiển thị một bộ sưu tập của các đối tượng được xác định bởi lớp sauLàm thế nào để thực hiện định dạng có điều kiện trong một GridView

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

Sau đó trong đánh dấu aspx của tôi, tôi có một cái gì đó giống như

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

Điều tôi muốn biết là:
Có cách nào để sử dụng định dạng có điều kiện trên trường ItemValue không, nếu đối tượng đang giữ một chuỗi, nó sẽ trả về chuỗi không đổi hoặc nếu nó giữ một DateTime nó sẽ hiển thị như DateTime.ToShortDateString().

Trả lời

10

Không chắc chắn nếu bạn có thể sử dụng một BoundField, nhưng nếu bạn thay đổi nó thành một TemplateField bạn có thể sử dụng một chức năng định dạng như trong this link.

tức là một cái gì đó giống như

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

Sau đó, trong codebehind của bạn, bạn có thể thêm một chức năng bảo vệ

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

Hoặc bạn có thể làm điều gì đó trong trường hợp OnRowCreated của GridView, như trong this link

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

chức năng này là định dạng có điều kiện dựa có hay không datavalue là null/là một đôi

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

Với BoundField bạn nên sửa đổi hạng mục của bạn.

Nếu bạn không muốn thay đổi ther CodeBehind của bạn là một loại lừa bạn có thể làm bằng một 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> 

rõ ràng là bạn có thể làm điều đó cho bất kỳ loại đối tượng nhưng có lẽ "văn bản" của bạn lĩnh vực sẽ trở thành .. phức tạp ..

bằng cách này .. CodeBehind tôi ví dụ này chỉ bạn lớp Item và Page_Load() này:

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

và kết quả là chính xác;)

0

Trong .NET 2.0 thậm chí còn dễ dàng hơn:

Thêm phương pháp này để mã sau: (ví dụ này định dạng một giá trị gấp đôi như triệu với 1 chữ số)

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

Trong đoạn code aspx, sử dụng này:

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

tôi quyết định với giải pháp Paul Rowland và một điều nữa "if (e.Item.DataItem là DataRowView)":

01.
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"; 
     } 
     } 
    }