DataBound DropDownList в DataGrid - порядок привязки - PullRequest
0 голосов
/ 01 декабря 2008

У меня есть DataGrid, который выглядит так (здесь немного упрощенно):

<asp:DataGrid ID="grdQuotas" runat="server" AutoGenerateColumns="False">
    <HeaderStyle CssClass="quotas-header" />
    <Columns>
        <asp:TemplateColumn>
            <HeaderTemplate>
                Max order level</HeaderTemplate>
            <ItemTemplate>
                <asp:DropDownList ID="ddlMaxOrderLevel" runat="server" DataSourceID="xdsOrderLevel"
                    DataTextField="Text" DataValueField="Value" SelectedValue='<%# Bind("MaxOrderLevel") %>'>
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateColumn>
    </Columns>
</asp:DataGrid>

<asp:XmlDataSource ID="xdsOrderLevel" runat="server" DataFile="~/App_Data/OrderLevels.xml">
</asp:XmlDataSource>

В моем обработчике событий Page_Load я создаю DataTable, содержащий значения по умолчанию и DataBind, передающий его в DataGrid.

Проблема в том, что это происходит до того, как DropDownList ddlMaxOrderLevel был привязан к DataSource, поэтому я получаю сообщение об ошибке выполнения, сообщающее, что SelectedValue не может быть установлен.

Если бы ddlMaxOrderLevel не было в DataGrid, я мог бы просто вызвать DataBind() на нем. Однако я не могу сделать это в этом сценарии - так как он находится в ItemTemplate.

Кто-нибудь может предложить обходной или альтернативный подход?

Ответы [ 2 ]

1 голос
/ 01 декабря 2008

Вы можете выполнить привязку данных в DropDownlist в событии Databound DataGrid.

Edit: Я приведу пример, который я протестировал:

 protected void dg_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
        if (e.Item.ItemType != ListItemType.Header && e.Item.ItemType != ListItemType.Footer)
        {
            DropDownList dl = (DropDownList)((DataGridItem)e.Item).FindControl("ddlMaxOrderLevel");

            dl.DataSource = levels;
            dl.DataBind();

            dl.SelectedValue = ((DataRowView)e.Item.DataItem)["number"].ToString();


        }

    }
0 голосов
/ 09 февраля 2009

Создайте другой источник данных и свяжите его с сеткой данных. Где SelectMethod будет возвращать значения по умолчанию в простом объекте.

Тогда все привязки должны счастливо работать вместе.

...