2011-10-25 177 views
3

想知道用我的對象數據填充GridView的最佳方式。使用對象數據填充GridView

我不得不從一個複雜的對象Sale,其結構是這樣的顯示產品列表:

class Sale { 
    int id; 
    List<SaleItem> saleItems; 
} 

class SaleItem { 
    int id; 
    int quantity; 
    Product product; 

    BillingAddress billingAddress; 
    ShippingAddress shippingAddress; 
} 

class Product { 
    int id; 
    string name; 
    List<BuyingConfiguration> buyingConfigurations; 
} 

class BuyingConfiguration { 
    string name; // like size, color, material 
    string value; 
} 

和我的格子應該是這樣的:

Sale Items 
+---------+---+------------+------------+----------------+ 
| Name | # | B. Address | S. Address | Configurations | 
+---------+---+------------+------------+----------------+ 
| Ferrari | 2 | --   | --   | Color: red  | 
|   | |   |   | Engine: Xyz | 
+---------+---+------------+------------+----------------+ 
| Jax  | 1 | --   | --   | Color: blue | 
|   | |   |   | Engine: Abc | 
+---------+---+------------+------------+----------------+ 

我應該實現一個ObjectDataSource爲我的Sale對象?有沒有更好的解決方案?


編輯2:讓我試着讓自己清楚:問題不在於如何顯示配置。 我的問題是,Sale對象從持久層返回到我的代碼,這就是爲什麼我不希望GridView直接訪問數據庫。相反,它需要從我的Sale對象中加載其所有數據,如何實現?


編輯:

網格的要求標記:

<asp:GridView runat="server" ID="GridProdutos" OnRowDataBound="GridProdutos_OnRowDataBound" 
    AutoGenerateColumns="False"> 
    <Columns> 
     <asp:BoundField HeaderText="Name" /> 
     <asp:BoundField HeaderText="#" /> 
     <asp:BoundField HeaderText="B. Address" /> 
     <asp:BoundField HeaderText="S. Address" /> 
     <asp:BoundField HeaderText="Configurations" /> 
    </Columns> 
</asp:GridView> 

醜陋的解決方案,到目前爲止,使用OnRowDataBound(我想避免這一點!):

protected void GridProdutos_OnRowDataBound(object sender, GridViewRowEventArgs e) { 
    if (e.Row.DataItem == null) 
     return; 

    SaleItem item = (SaleItem)e.Row.DataItem; 

    e.Row.Cells[0].Text = item.product.name; 
    e.Row.Cells[1].Text = item.quantity.ToString(); 

    StringBuilder sbConfigurations = new StringBuilder(); 

    foreach (BuyingConfiguration configurationItem in item.product.buyingConfigurations) { 
     sbConfigurations.AppendFormat("{0}: {1}<br />", configurationItem.name, configurationItem.value); 
    } 
    e.Row.Cells[4].Text = sbConfigurations .ToString(); 
} 
+0

請使用網格定義顯示您的頁面標記。 –

+0

@DavidePiras它很簡單,添加到問題 –

+0

我想你可以添加一箇中繼控件來顯示配置項。中繼器的數據源應該通過使用給定數據源的「綁定()」方法來綁定,這消除了RowDataBound的東西。希望這可以幫助!! – Praveen

回答

3

我會使用TemplateColumns與綁定表達式建議。您可以將GridView綁定到saleItems列表,並實現getter方法來渲染給定SaleItem實例的每個字段。

  <asp:TemplateField> 
       <ItemTemplate> 
        <%# getSaleItemProductName((SaleItem)Container.DataItem) %> 
       </ItemTemplate> 
      </asp:TemplateField> 

別:

  <asp:TemplateField> 
       <ItemTemplate> 
        <%# ((SaleItem)Container.DataItem).product.Name %> 
       </ItemTemplate> 
      </asp:TemplateField> 

同樣的事情可以用一個自定義的getter方法來移動訪問的詳細信息到後臺代碼來實現:例如,如下您的姓名列可以被定義t忘記添加Import指令以便能夠引用您的類型:

<%@ Import Namespace="YouNamespaceHere" %> 
+0

謝謝,你的解決方案更清潔,雖然我會盡量避免在我的aspx文件中的代碼。 –

1
dataGridView1.DataSource = ToDataTable(SaleItems); 

您可以將數據綁定直接的dataGridView,如果你能複雜的對象列表轉換爲數據表作爲波紋管

private DataTable ToDataTable(List<Sale> SaleItems) 
    { 
     DataTable returnTable = new DataTable("Sale"); 
     returnTable.Columns.Add(new DataColumn("Name")); 
     returnTable.Columns.Add(new DataColumn("#")); 
     returnTable.Columns.Add(new DataColumn("B. Address")); 
     returnTable.Columns.Add(new DataColumn("S. Address")); 
     returnTable.Columns.Add(new DataColumn("Configurations")); 

     foreach (Sale item in SaleItems) 
     { 
      returnTable.AcceptChanges(); 
      DataRow row = returnTable.NewRow(); 
      row[0] = item.product.name; 
      row[1] = item.quantity.ToString(); 
      row[2] = item.billingAddress.ToString(); 
      row[3] = item.billingAddress.ToString(); 
      StringBuilder sbConfigurations = new StringBuilder(); 

      foreach (BuyingConfiguration configurationItem in item.product.buyingConfigurations) { 
       sbConfigurations.AppendFormat("{0}: {1}<br />", configurationItem.name, configurationItem.value); 
      } 
      row[4] = sbConfigurations.ToString(); 

      returnTable.Rows.Add(row); 
     } 
     return returnTable; 
    } 
+0

我喜歡你的方式來轉換我的對象在數據表中,但這樣我保持我的代碼非常類似於它已經。我需要一個更「乾淨」的解決方案。 –