0

我有一个 gridview,它有 2 种列类型,它们是从 sqldatasources 填充的

TransportationMode(Disabled Dropdownlist), ContainerType(Enabled Dropdownlist),

Vessel  - 20DC
Vessel  - 20RF
Vessel  - 40DC
Vessel  - 40HC
Vessel  - 40RF
Air - Air pick up
Air   - Courier Courier
Truck   - Full Reefer Truck
Truck   - Full Truck
Vessel   - Partial Container
Vessel   - Partial Reefer Container
Truck   - Partial Reefer Truck
Truck   - Partial Truck
Railway - Wagon pick up

问题是,例如,当我的 gridview 中一行的 TransportationMode 被选为“Air”时,那么如何过滤 ContainerType 并且只应在下拉列表中填充 Air Pick Up 和 Courier Courier。

4

1 回答 1

1

基本上你需要做的是拥有 3 个数据源

  1. 一个用于网格视图
  2. 一个用于主下拉列表
  3. 最后一个为孩子下拉列表

一旦你EditItemTemplate为下拉菜单创建了字段,你就设置好了:

    <asp:SqlDataSource
        ID="transportAndContainerTypeDS"
        runat="server"
        ConnectionString="<%$ ConnectionStrings:transportConnection %>"
        SelectCommand="SELECT T.TransportationId, T.TransportationMode, CT.ContainerTypeId, CT.ContainerType FROM Transportation AS T INNER JOIN ContainerType AS CT ON T.TransportationId = CT.TransportationId"></asp:SqlDataSource>
    <asp:GridView ID="gvTransportation"
        runat="server"
        AutoGenerateEditButton="true"
        AutoGenerateColumns="False"
        DataSourceID="transportAndContainerTypeDS"
        DataKeyNames="TransportationId,ContainerTypeId">
        <Columns>
            <asp:BoundField DataField="TransportationId" Visible="false" />
            <asp:BoundField DataField="ContainerTypeId" Visible="false" />
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Label ID="Label3" runat="server" Text='<%# Eval("TransportationMode") %>' />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlTransportation" runat="server"
                        DataSourceID="transportationDS"
                        AutoPostBack="true"
                        DataValueField="TransportationId"
                        DataTextField="TransportationMode"
                        SelectedValue='<%# Eval("TransportationId") %>'>
                    </asp:DropDownList>
                    <asp:SqlDataSource ID="transportationDS" runat="server"
                        ConnectionString="<%$ ConnectionStrings:transportConnection %>"
                        SelectCommand="SELECT TransportationId,TransportationMode FROM Transportation"></asp:SqlDataSource>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Label ID="Label4" runat="server" Text='<%# Eval("ContainerType") %>' />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlContainerType"
                        runat="server"
                        DataSourceID="containerDS"
                        DataValueField="ContainerTypeId"
                        DataTextField="ContainerType"
                        OnDataBound="ddlContainerType_DataBound" />
                    <asp:SqlDataSource ID="containerDS"
                        runat="server"
                        ConnectionString="<%$ ConnectionStrings:transportConnection %>"
                        SelectCommand="SELECT ContainerTypeId,TransportationId,ContainerType FROM ContainerType WHERE TransportationId = @TransportationId"
                        SelectCommandType="Text">
                        <SelectParameters>
                            <asp:ControlParameter
                                ControlID="ddlTransportation"
                                Name="TransportationId"
                                PropertyName="SelectedValue"
                                Type="Int32" />
                        </SelectParameters>
                    </asp:SqlDataSource>
                </EditItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

后面的代码:

protected void ddlContainerType_DataBound(object sender, EventArgs e)
{
    var ddlContainerType = (DropDownList)sender;
    ddlContainerType.Items.Insert(0, new ListItem("Make a Selection", String.Empty));
    ddlContainerType.SelectedIndex = 0;

    GridViewRow gvr = (GridViewRow)ddlContainerType.NamingContainer;
    if (gvr.DataItem != null)
    {
        string strModel = ((System.Data.DataRowView)gvr.DataItem)["ContainerType"].ToString();
        ddlContainerType.ClearSelection();

        var li = ddlContainerType.Items.FindByValue(strModel);
        if (li != null)
            li.Selected = true;
    }
}

希望这可以帮助!

于 2012-11-10T16:04:58.753 回答