首页 > 解决方案 > 如何在 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'

标签: vb.netcombobox

解决方案


就目前而言,我可以看到两个错误。首先,不要连接字符串来构建 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 

推荐阅读