假设我有两张桌子:
a)表A
|country| id_country |
|------- | ---------- |
|USA | 1 |
|England | 2 |
b)表B
city | id_country
---------- | ----------
NY | 1
LA | 1
London | 2
Manchester | 2
显然,如果我选择美国,第二个下拉列表应显示NY和LA,但我不知道如何存储第一个下拉列表的参数。筛选第二个下拉列表的代码应该如下所示:
select
B.city
from
A, B
where
B.id_country = X
x是firstdropdownlist(A.id_country)的参数,是什么想法可以解决我的问题?
答案 0 :(得分:1)
将第一个下拉列表与id_country绑定为值成员,将country作为显示成员绑定。将拳头下拉列表的AutoPostBack
属性设置为true。将选定的索引更改事件添加到第一个下拉列表(双击设计视图下拉列表)。在选定的索引更改事件上,您可以加载第二个下拉列表。
select city, id_country from B where id_country = @id_country
从第一个下拉列表SelectedValue
设置id_country参数,设置第二个下拉数据源,显示和评估成员,最后调用第二个下拉列表中的DataBind()
如果您需要完整教程,请检查Creating Cascading DropDownLists in ASP.Net,或者您可以尝试AJAX Cascading DropDownList with data load using web service methods without full page poastback
答案 1 :(得分:0)
您可以通过某些AJAX调用来执行此操作,当您更改从第一个下拉列表中选择的选项时,您将更新第二个下拉列表中的选项。
e.g:
您首先加载国家/地区的第一个下拉列表。 但是不要加载任何城市。
然后,当您从下拉列表中选择某个国家/地区时,您可以根据所选国家/地区的后端通过某些AJAX调用来更新城市下拉列表中的选项。
希望它有所帮助。
答案 2 :(得分:0)
为什么需要存储参数?我有一个应用程序,我们有活动类别,然后是两个更多级别的细节,第二级取决于所选类别,第三级取决于第二级。
注意 - 此应用程序是用Visual Basic编写的,但我没有看到任何有关排除c#的概念。
在我的示例中,下拉列表称为ddlActType(主级别),ddlAct2Type和ddlAct3Type
加载页面时会加载主列表。我创建了一个名为“selectAct”的变量来存储与列表选择相关联的值,该值与表上的标识值相匹配。我实际上不需要创建变量,但是命名使得为维护目的而更加明显。当进行选择时,辅助下拉列表变为可用并填充,使用所选值作为过滤器,其中项目在辅助列表中加载。如果在辅助节点上对该第三级列表进行了选择,则相同。在所有“SelectedIndexChanged”例程中,如果他们选择默认值/无,则后续列表将被禁用并变为不可见。
主要清单选择 -
Protected Sub Activity_Type_Change(ByVal sender As Object, ByVal e As System.EventArgs)
Handles ddlActType.SelectedIndexChanged
Dim selectedAct As Integer = 0
If ddlActType.SelectedIndex = 0 Then
ddlAct2Type.Visible = False
lblSpecs.Visible = False
ddlAct3Type.Visible = False
lblDetails.Visible = False
Else
ddlAct2Type.Visible = True
lblSpecs.Visible = True
ddlAct3Type.Visible = False
lblDetails.Visible = False
selectedAct = ddlActType.SelectedValue
Populate_Activity2_DDL(selectedAct)
End If
End Sub
加载第二个列表的例程,将第一个列表选择作为过滤器参数传递 -
Protected Sub Populate_Activity2_DDL(ByVal selOne As Integer)
Dim strProcName As String = "usp_Get2ndLevelList"
Dim connSQL As New SqlConnection
Dim cmd As SqlCommand
connSQL.ConnectionString = ConfigurationManager.ConnectionStrings("ThisDBsConnectionString").ToString
cmd = New SqlCommand(strProcName, connSQL)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("ActTypeID", selOne)
cmd.Connection.Open()
'dd_AT2_Values means drop-down list activity type 2 values'
Dim ddl_AT2_Values As SqlDataReader
ddl_AT2_Values = cmd.ExecuteReader()
If ddl_AT2_Values.HasRows = False Then
ddlAct2Type.Visible = False
lblSpecs.Visible = False
cmd.Connection.Close()
cmd.Connection.Dispose()
Exit Sub
End If
ddlAct2Type.DataSource = ddl_AT2_Values
ddlAct2Type.DataValueField = "Ac2Type_ID"
ddlAct2Type.DataTextField = "Ac2T_Name"
ddlAct2Type.DataBind()
ddlAct2Type.Items.Insert(0, New ListItem(String.Empty, String.Empty))
ddlAct2Type.SelectedIndex = 0
cmd.Connection.Close()
cmd.Connection.Dispose()
End If
End Sub
如果您不想,您实际上不需要存储第一个列表中的选择,因为它仍保留为选定值。第一个列表的原始加载是在非回发条件下完成的。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If IsPostBack Then
Else
Populate_Activity_DDL()
End If
End Sub
如果您需要更多详细信息,请通过评论申请,我会根据需要进行修改和增强。