Заполните GridView данными объекта - PullRequest
3 голосов
/ 25 октября 2011

Хотите узнать, как лучше всего заполнить 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();
}

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

Я бы предложил использовать TemplateColumns с выражениями привязки. Вы можете привязать свой GridView к списку saleItems и реализовать методы получения, чтобы визуализировать каждое поле с учетом экземпляра SaleItem. Например, ваш столбец Имя может быть определен следующим образом:

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

То же самое можно сделать с помощью пользовательского метода получения, чтобы переместить детали доступа в выделенный код:

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

Не забудьте добавить директиву Import, чтобы иметь возможность ссылаться на ваши типы:

<%@ Import Namespace="YouNamespaceHere" %>
1 голос
/ 25 октября 2011
  dataGridView1.DataSource = ToDataTable(SaleItems);

вы можете привязать данные непосредственно к dataGridView, если вы можете преобразовать список сложных объектов в Datatable как показано ниже

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