在转发器内填充级联下拉列表

时间:2015-01-14 22:56:12

标签: c# asp.net

我在转发器中有两个下拉列表。根据我在第一个下拉列表中选择的值,第二个需要填充(两者都需要通过存储过程从DB填充)。对此有任何帮助。

我正在添加我到目前为止的代码,但它并不完全正确

<asp:Repeater ID="rpt" runat="server" OnItemDataBound="rpt_ItemDataBound">
                        <ItemTemplate>
                             <tr>
                                <td style="width: 40%; text-align: left">
                                    <asp:DropDownList ID="ddlOne" runat="server" Width="150px" OnSelectedIndexChanged="PopulateSecondDropDown_selectIndexchanged"
                                        AutoPostBack="true">
                                    </asp:DropDownList>
                                </td>
                                </td>
                                <td style="width: 40%; text-align: left">
                                    <asp:DropDownList ID="ddlTwo" runat="server" Width="150px">
                                    </asp:DropDownList>
                                </td>
                            </tr>
                        </ItemTemplate>
                    </asp:Repeater>

<asp:Button ID="Save" runat="server" Text="Save" OnClick="Save_Values_Click"/>

在页面上加载

    rpt.ItemDataBound += new RepeaterItemEventHandler(rpt_ItemDataBound);
    rpt.DataSource = ListForFirstDropDown.GetDropDownList;   // this returns values only for the first dropdownlist
    rpt.DataBind();






   protected void rpt_ItemDataBound(object source, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item | e.Item.ItemType == ListItemType.AlternatingItem)
        {
                            // not sure how to handle this here

        }
    }




public void PopulateSecondDropDown_selectIndexchanged(object sender, EventArgs e)
        {
            ddlTwo.Items.Clear();
            int ID = Convert.ToInt32(ddlOne.Text);
            LoadSecondDropDown(ID);
        }

        private void LoadSecondDropDown(int ID)
        {
                    rpt.DataSource = ListForSecondDropDown.GetDropDownList(ID);   // this returns values only for the second dropdownlist
            rpt.DataBind();
        }

1 个答案:

答案 0 :(得分:0)

使用SQLDataSource,您可以使用SelectParameters定义select语句中使用的条件。这允许您使用许多来源作为参数值,包括页面上的另一个控件。

以下是填充下拉列表的SQLDataSource示例,其选定值在另一个数据源和列表中使用:

<asp:SqlDataSource 
    runat="server"
    ID="firstDataSource"
    ConnectionString="<%$ connectionStrings:MyConnectionString %>"
    SelectCommand="SELECT DISTINCT item1 FROM table" />
<asp:DropDownList 
    runat="server" 
    ID="itemList" 
    DataSourceID="firstDataSource" 
    DataValueField="item1" 
    DataTextField="item1" 
    AutoPostBack="true" />

<asp:SqlDataSource 
    runat="server"
    ID="secondDataSource"
    ConnectionString="<%$ connectionStrings:MyConnectionString %>"
    SelectCommand="SELECT item2 FROM table WHERE item1 = @item1">
    <SelectParameters>
        <asp:ControlParameter ControlID="itemList" PropertyName="SelectedValue" Name="item1" />
    </SelectParameters>
</asp:SqlDataSource>
<asp:DropDownList 
    runat="server" 
    DataSourceID="secondDataSource" 
    DataValueField="item2" 
    DataTextField="item2" />

这适用于转发器的ItemTemplate。如果“firstDataSource”需要来自转发器项的键,则可以使用隐藏的字段控件和另一个ControlParameter

<asp:Repeater runat="server" DataSourceID="topDataSource">
    <ItemTemplate>
        <asp:HiddenField runat="server" ID="key" Value='<%# Eval("id") %>' />
        <!-- ... -->
     </ItemTemplate>
</asp:Repeater>