过滤DropDownList不起作用

时间:2012-01-23 21:17:10

标签: asp.net sql-server

我的网站上有几个DropDownList,它们互相过滤。

所以,我有一所学校,基于我的课程,在课程中我有学生。每个人在DB上都有自己的表,它是从具有所有ID的表生成的。

我不知道为什么,但我可以从学校过滤课程,但学生DropdownList不会受到过滤器的影响。

这是我的代码:

<li>School </li>
<li>
    <asp:DropDownList ID="SchoolBox" runat="server" AutoPostBack="True" 
        DataSourceID="DropDownlistSchool" DataTextField="SchoolName" 
        DataValueField="ID">
    </asp:DropDownList> 
    <asp:SqlDataSource ID="DropDownlistSchool" runat="server" 
        ConnectionString="<%$ ConnectionStrings:DanielConnectionString %>" 
        SelectCommand="SELECT [SchoolName], [ID] FROM [Schools]">
    </asp:SqlDataSource>
</li>
<li>Class</li>
<li>
    <asp:DropDownList ID="ClassBox" runat="server" AutoPostBack="True" 
        DataSourceID="Class2" DataTextField="ClassName" DataValueField="ID">
    </asp:DropDownList>

    <asp:SqlDataSource ID="Class2" runat="server" 
        ConnectionString="<%$ ConnectionStrings:DanielConnectionString %>" 
        SelectCommand="SELECT * FROM [Class] WHERE ([SchoolID] = @SchoolID)">
        <SelectParameters>
            <asp:ControlParameter ControlID="SchoolBox" Name="SchoolID" 
                PropertyName="SelectedValue" Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>

</li>
<li>Student</li>
<li>
    <asp:DropDownList ID="StudentBox" runat="server" AutoPostBack="True" 
        DataSourceID="Student" DataTextField="Username" DataValueField="ID">
    </asp:DropDownList>
    <asp:SqlDataSource ID="Student" runat="server" 
        ConnectionString="<%$ ConnectionStrings:DanielConnectionString %>" 

        SelectCommand="SELECT * FROM [Users] WHERE (([ClassID] = @ClassID) AND ([SchoolID] = @SchoolID))">
        <SelectParameters>
            <asp:ControlParameter ControlID="ClassBox" Name="ClassID" 
                PropertyName="SelectedValue" Type="Int32" />
            <asp:ControlParameter ControlID="SchoolBox" Name="SchoolID" 
                PropertyName="SelectedValue" Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>

3 个答案:

答案 0 :(得分:1)

您需要向“ClassBox”DropDownList添加数据绑定事件:

<asp:DropDownList ID="ClassBox" runat="server" AutoPostBack="True" 
    DataSourceID="Class2" DataTextField="ClassName" DataValueField="ID"
    OnDataBound="ClassBox_DataBound" >
</asp:DropDownList>

然后,在您的代码中,您需要这样做:

protected void ClassBox_DataBound(object sender, EventArgs e)
{
    // Bind the SQLDataSource
    Student.DataBind();
    // Re-bind the associated DropDownList
    StudentBox.DataBind();
}

当您选择学校时,会发生AutoPostBack,并且“ClassBox”会根据“SchoolBox”的SelectedValue进行更新。此时,“ClassBox”还没有SelectedValue,因此“StudentBox”数据源没有参数。一旦“ClassBox”被数据绑定,就可以安全地重做“StudentBox”的数据绑定(从而在那里获取新信息)。

答案 1 :(得分:0)

在班级&amp;学生放下你已经设置:

DataValueField="ID"

这应该设置为:

DataValueField="ClassId", DataValueField="StudentId"

分别。

除非您在表格中也有Id字段,否则

答案 2 :(得分:0)

我有一个类似的表格,带有级联的DropDownLists,每个都过滤下一个。我发现使用上面提到的方法,它只会在第一次在DropDownList中选择一个值时起作用,但之后我无法再获得列表的值。换句话说,当我第一次加载表单并为第一个DropDownList选择一个值时,第二个将填充...当我选择第二个值时,第三个将填充...但是如果我然后更改了第二个的值,我无法让第三个再次重新填充。它始终陷入第一组价值观。

所以我构建了一个名为RebuildDropDown的小函数,我从OnSelectedIndexChanged处理程序调用它。在给定DropDownList的处理程序中,我为每个依赖列表调用RebuildDropDown,如下所示:

protected void SchoolBox_SelectedIndexChanged(object sender, EventArgs e)
{
    RebuildDropDown(ClassBox);
    RebuildDropDown(StudentBox);
}

protected void ClassBox_SelectedIndexChanged(object sender, EventArgs e)
{
    RebuildDropDown(StudentBox);
}

protected void RebuildDropDown(DropDownList ddl)
{
    ddl.Items.Clear();

    // OPTIONAL: add "ALL" option as first option
    ListItem li = new ListItem("All", "ALL");
    ddl.Items.Add(li);

    // now add databound items
    ddl.DataBind();
}