基于前一个的ASP.NET过滤下拉列表

时间:2016-11-18 15:22:13

标签: c# mysql asp.net

假设我有两张桌子:
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)的参数,是什么想法可以解决我的问题?

3 个答案:

答案 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

如果您需要更多详细信息,请通过评论申请,我会根据需要进行修改和增强。