asp.net - 使用 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
解决方案
首先,不要在页面加载时弄乱打开或关闭连接。
接下来,请记住 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 辅助例程?
获取代码的连接字符串设置。您在数百个地方使用它,更糟糕的是在网络发布时您需要更改它。
推荐阅读
- sql-server - 如何使 Apache NiFi 同步/镜像数据库源和目标
- r - 有关 R 中 str_extract 中语义的信息?(举个例子)
- jenkins - 通过具有更多磁盘空间的从机构建 Jenkins 作业
- arrays - 在反应状态下更改嵌套数组对象
- bash - makefile 中的条件构造中出现意外的 EOF
- excel - vba 将复制的值粘贴到变量中(application.onkey)
- mongodb - 如何在 terraform 中使用 mongodbatlas 提供程序获取完整的 uri,包括用户名和密码
- active-directory - WSO2 Identity Server 5.7.0 如何为 Active Directory 配置用户存储
- kotlin - 在 IntellijIDEA 中编译 Kotlin:“类路径中的某些运行时 JAR 文件的版本不兼容。考虑将它们从类路径中删除”
- node.js - 部署自定义链码时出现 Hyperledger 结构错误