Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用对象数据填充GridView_C#_Asp.net_Gridview_Objectdatasource - Fatal编程技术网

C# 用对象数据填充GridView

C# 用对象数据填充GridView,c#,asp.net,gridview,objectdatasource,C#,Asp.net,Gridview,Objectdatasource,想知道用我的对象数据填充GridView的最佳方法 我必须显示一个复杂对象Sale的产品列表,其结构如下: class Sale { int id; List<SaleItem> saleItems; } class SaleItem { int id; int quantity; Product product; BillingAddress billingAddress; ShippingAddress shipping

想知道用我的对象数据填充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    |
+---------+---+------------+------------+----------------+
我应该为我的
Sale
对象实现ObjectDataSource吗?有没有更好的解决办法


编辑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(我想避免这种情况!)是一个丑陋的解决方案:

受保护的void GridProdutos\u OnRowDataBound(对象发送方,GridViewRowEventArgs e){
if(e.Row.DataItem==null)
返回;
SaleItem项目=(SaleItem)e.Row.DataItem;
e、 行。单元格[0]。文本=item.product.name;
e、 Row.Cells[1]。Text=item.quantity.ToString();
StringBuilder sbConfigurations=新的StringBuilder();
foreach(item.product.BuyingConfiguration中的BuyingConfiguration配置项){
sbConfigurations.AppendFormat(“{0}:{1}
”,configurationItem.name,configurationItem.value); } e、 Row.Cells[4].Text=sbConfigurations.ToString(); }
若可以将复杂对象列表转换为Datatable,则可以将数据直接绑定到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;
    }
私有数据表到数据表(列出项目)
{
DataTable returnTable=新的DataTable(“销售”);
returnTable.Columns.Add(新数据列(“名称”));
returnTable.Columns.Add(新数据列(“#”);
returnTable.Columns.Add(新数据列(“B.地址”);
returnTable.Columns.Add(新数据列(“S.Address”);
returnTable.Columns.Add(新数据列(“配置”));
foreach(SaleItems中的销售项目)
{
returnTable.AcceptChanges();
DataRow行=returnTable.NewRow();
行[0]=item.product.name;
行[1]=item.quantity.ToString();
行[2]=item.billingAddress.ToString();
行[3]=item.billingAddress.ToString();
StringBuilder sbConfigurations=新的StringBuilder();
foreach(item.product.BuyingConfiguration中的BuyingConfiguration配置项){
sbConfigurations.AppendFormat(“{0}:{1}
”,configurationItem.name,configurationItem.value); } 行[4]=sbConfigurations.ToString(); returnTable.Rows.Add(row); } 返回表; }
我建议将TemplateColumns与绑定表达式一起使用。您可以将GridView绑定到saleItems列表,并实现getter方法来呈现给定SaleItem实例的每个字段。例如,您的名称列可以定义如下:

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

使用自定义getter方法可以完成同样的操作,将访问详细信息移动到代码中:

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

不要忘记添加导入指令,以便能够引用您的类型:

<%@ Import Namespace="YouNamespaceHere" %>


请使用网格定义显示页面标记。@DavidePiras它非常简单,添加到问题中。我想您可以添加一个repeater控件来显示配置项。应使用给定数据源的“Bind()”方法绑定中继器的数据源,该方法消除了RowDataBound内容。希望这有帮助@Praveen但首先我要知道如何直接从我的
Sale
对象加载所有网格数据,而不是从数据库加载(正如我在第二次编辑中指出的那样)。我喜欢您在数据表中转换我的对象的方法,但这样我就可以保持我的代码与现在的代码非常相似。我需要一个更“干净”的解决方案。谢谢,你的解决方案更干净,尽管我会尽量避免在我的aspx文件中使用代码。
            <asp:TemplateField>
                <ItemTemplate>
                    <%# getSaleItemProductName((SaleItem)Container.DataItem) %>
                </ItemTemplate>
            </asp:TemplateField>
<%@ Import Namespace="YouNamespaceHere" %>