首页 > 解决方案 > 使用 Vb.Net 根据 Asp.Net 中的另一个 DropDownList 值更改 DropDownList

问题描述

我尝试根据另一个下拉列表值更改我的下拉列表值。在输出屏幕上加载第一个下拉值,但在第一个下拉列表项更改后未显示第二个下拉列表值

Dim con As New SqlConnection("Data Source=DESKTOP-311HSD1;Initial Catalog=Covid;Integrated Security=True;Pooling=False")

Dim cmd As SqlCommand
Dim ds As DataSet
Dim sda As SqlDataAdapter
Dim sdr As SqlDataReader

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Try
        If con.State = ConnectionState.Closed Then
            con.Open()
        End If
        If Not IsPostBack Then
            BindDistrict()
        End If
    Catch ex As Exception
    End Try
End Sub
Private Sub BindDistrict()

    Try
        Using sqlConn As New SqlConnection("Data Source=DESKTOP-311HSD1;Initial Catalog=Covid;Integrated Security=True;Pooling=False")
            Using sqlCmd As New SqlCommand()
                sqlCmd.CommandText = "SELECT DISTINCT District FROM [dbo].[Hospital]"
                sqlCmd.Connection = sqlConn
                sqlConn.Open()
                Dim da As New SqlDataAdapter(sqlCmd)
                Dim dt As New DataTable()
                da.Fill(dt)
                drp_dist.DataSource = dt
                drp_dist.DataValueField = "District"
                drp_dist.DataTextField = "District"
                drp_dist.DataBind()
                sqlConn.Close()
                drp_dist.Items.Insert(0, New ListItem("Select District", "0"))
            End Using
        End Using
    Catch ex As Exception

    End Try
End Sub
Private Sub drp_dist_SelectedIndexChanged(sender As Object, e As EventArgs) Handles drp_dist.SelectedIndexChanged

    Dim district As String = drp_dist.SelectedValue.ToString()
    BindHospital(district)

End Sub
Private Sub BindHospital(ByVal district As String)

    Dim dist As String = district
    Try
        Using sqlConn As New SqlConnection("Data Source=DESKTOP-311HSD1;Initial Catalog=Covid;Integrated Security=True;Pooling=False")

            Using sqlCmd As New SqlCommand()
                sqlCmd.CommandText = "SELECT * FROM [dbo].[Hospital] WHERE District='" + dist + "'"
                sqlCmd.Connection = sqlConn
                sqlConn.Open()
                Dim da As New SqlDataAdapter(sqlCmd)
                Dim dt As New DataTable()
                da.Fill(dt)
                drp_hospital.DataSource = dt
                drp_hospital.DataValueField = "HospitalID"
                drp_hospital.DataTextField = "Hospital_Name"
                drp_hospital.DataBind()
                sqlConn.Close()
                drp_hospital.Items.Insert(0, New ListItem("Select Hospital", "0"))
            End Using
        End Using
    Catch ex As Exception

    End Try
End Sub

标签: asp.netvb.net

解决方案


首先,不要在页面加载时弄乱打开或关闭连接。

接下来,请记住 sqlCommand 对象具有

sql command text - no need for separate variable
sql connection - no need for separate variable
sql reader - no need for separate reader

sql 数据适配器 - 除非您要更新数据“认为适应 = 需要更改数据”,否则不要使用它。

因此,上述概念可以让您编写更少的代码、更简洁的代码,并让您专注于代码,而不是所有阅读器和连接的东西。

接下来,您可以(应该)考虑将连接字符串放在项目设置区域中。(它有一个连接构建器,更好的是它还可以为您更新 Web 配置,而无需您付出任何努力。

好的,考虑到上述情况?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then

        drp_dist.DataSource = MyRst("SELECT DISTINCT District FROM [dbo].[Hospital]")
        drp_dist.DataBind()
        drp_dist.Items.Insert(0, New ListItem("Select District", "0"))
    End If

End Sub

按理说,您可能必须在 100 多个地方输入 sql 和命令。既然你一遍又一遍地这样做,那么一个非常简单的辅助例程可以提供帮助。

接下来,您在第一页加载中加载网格、组合框或其他任何内容 - 但仅加载第一页(回发 = false)。

因此,级联两个组合框的代码可以而且应该如下所示:

YES 将组合框的 DataText 和 DataValue 设置放在标记中 - 不在代码中。(它的自我记录)。

好的,所以现在我们需要级联部分。确保标记中的第一个组合是 autopostback=true。

所以,我们现在有:

Private Sub BindHospital(ByVal district As String)

    Using sqlCmd As New SqlCommand("SELECT * FROM Hospital WHERE District = @dist",
                    New SqlConnection(My.Settings.TEST4))

    sqlCmd.Parameters.Add("@dist", SqlDbType.NVarChar).Value = district
    sqlCmd.Connection.Open()
    drp_hospital.DataSource = sqlCmd.ExecuteReader()
    drp_hospital.DataBind()
    drp_hospital.Items.Insert(0, New ListItem("Select Hospital", "0"))

End Using

using 块也会为您关闭连接 - 所以我们不必这样做。

还有那个简单的辅助程序?

这个:

Public Function MyRst(strSQL As String) As DataTable

    Dim rstData As New DataTable

    Using cmdSQL As New SqlCommand(strSQL, New SqlConnection(My.Settings.TEST4))
        cmdSQL.Connection.Open()
        rstData.Load(cmdSQL.ExecuteReader)
    End Using

    Return rstData

End Function

即使您不使用 MyRst 辅助例程?

获取代码的连接字符串设置。您在数百个地方使用它,更糟糕的是在网络发布时您需要更改它。


推荐阅读