DataGrid中的DataBound DropDownList - 绑定顺序

时间:2008-12-01 11:27:55

标签: asp.net data-binding datagrid webforms drop-down-menu

我有一个看起来像这样的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

问题是这是在{/ 1>} ddlMaxOrderLevel 绑定到DropDownList之前发生的,所以我遇到了运行时错误告诉我DataSource无法设置。

如果 ddlMaxOrderLevel 不在SelectedValue,我可以在其上调用DataGrid。但是,在这种情况下我无法做到这一点 - 因为它位于DataBind()

有人可以提出解决方法或替代方法吗?

2 个答案:

答案 0 :(得分:1)

您可以在DataGrid的Databound事件中执行DropDownlist的数据绑定。

编辑: 我将举例说明我已经测试过:

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


        }

    }

答案 1 :(得分:0)

创建另一个DataSource并将其绑定到DataGrid。 SelectMethod将在简单对象中返回默认值。

然后所有绑定应该愉快地一起工作。