我的网站上有几个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>
答案 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();
}