其他分享
首页 > 其他分享> > CodeGo.net>用对象数据填充GridView

CodeGo.net>用对象数据填充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    |
+---------+---+------------+------------+----------------+

我应该为我的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(我想避免这种情况!):

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

解决方法:

我建议将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指令以能够引用您的类型:

<%@ Import Namespace="YouNamespaceHere" %>

标签:gridview,objectdatasource,asp-net,c
来源: https://codeday.me/bug/20191102/1988605.html