vb.net - 如何在 VB 中填充主详细信息组合框?
问题描述
我有两个带有主从关系表银行和分行的组合框
我背后的VB代码:-
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\New\Test.accdb")
Using cmd As New OleDbCommand("Select Bank, ID from Bank", con)
Dim da As New OleDbDataAdapter(cmd)
Dim dt As New DataTable
da.Fill(dt)
ComboBox1.DataSource = dt
ComboBox1.DisplayMember = "Bank"
ComboBox1.ValueMember = "ID"
ComboBox1.Text = "Select"
End Using
End Using
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Dim bankId = ComboBox1.SelectedValue.ToString
Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\New\Test.accdb")
Using branch_cmd As New OleDbCommand("Select Branch from Branch where Bank_id ='" & bankId & "'", con)
Dim da As New OleDbDataAdapter(branch_cmd)
Dim dt As New DataTable
da.Fill(dt)
ComboBox2.DataSource = dt
ComboBox2.DisplayMember = "Bank"
ComboBox2.ValueMember = "ID"
End Using
End Using
End Sub
End Class
我想根据第一个组合框选择的值填充第二个组合框,但是代码在 ComboBox1_SelectedIndexChanged 函数上出错:
而且,从调试 branch_cmd sql 是:
Select Branch from Branch where Bank_id ='System.Data.DataRowView'
解决方案
就目前而言,我可以看到两个错误。首先,不要连接字符串来构建 sql 命令文本。始终使用参数化查询,准确指定您传递的参数的数据类型。第二个错误出现在第二个组合的 DisplayMember 和 ValueMember 中。您在这里没有 Bank_Id 或银行名称,而是分行名称
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
' Always check if you have a valid selection to avoid NRE.
if ComboBox1.SelectedValue Is Nothing Then
Return
End if
' If bankid is an integer then convert to an integer
Dim bankId as Integer = Convert.ToInt32(ComboBox1.SelectedValue)
Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\New\Test.accdb")
Using branch_cmd As New OleDbCommand("Select Branch from Branch where Bank_id =@id", con)
cmd.Parameters.Add("@id", OleDbType.Integer).Value = bankId
Dim da As New OleDbDataAdapter(branch_cmd)
Dim dt As New DataTable
da.Fill(dt)
ComboBox2.DataSource = dt
ComboBox2.DisplayMember = "Branch"
ComboBox2.ValueMember = "Branch"
End Using
End Using
End Sub
根据您在下面的评论,您将获得System.Data.DataRowView作为SelectedValue中包含的元素。您的问题中显示的代码不应该发生这种情况,所以也许有一些不同的东西会导致问题。(例如,如果数据表字段名称与 ValueMember/DisplayMember 属性不匹配)
无论如何,从 DataRowView 中,您应该能够以这种方式获取整数
Dim drv = DirectCast(ComboBox1.SelectedValue, DataRowView)
if drv IsNot Nothing then
Dim bankid = Convert.ToInt32(drv("ID"))
...
End if
推荐阅读
- c# - 在 Vimeo 上上传视频时如何获取 videoId
- amazon-web-services - 在 1-2 小时不活动后从存储桶加载 img 时使用 AWS S3 出现错误
- symfony - 教义删除必须进行两次才能起作用
- javascript - Fullcalendar V4 或 V5,如何删除 resourceTimeline 类型中的插槽标签行
- python - 迭代列表并将值存储在动态变量中
- react-native - 如何在 React Native 中合并图像
- reactjs - 将属性从 DropzoneArea 传递到 Dropzone
- python - Python - 列表字典的二进制搜索
- javascript - 如何使用 React Js 创建多列下拉列表?
- r - 在 R 中绘制按时间排序的布尔值序列