【问题标题】:How to populate a ComboBox depending on the selected item from another ComboBox in VB如何根据 VB 中另一个 ComboBox 中的选定项填充 ComboBox
【发布时间】:2015-02-09 06:59:56
【问题描述】:

我的 MySql 数据库中有表:

  1. 材料
  2. 计量单位

我还有 2 个组合框:

  1. cmbHeader - 此组合框填充数据库内的表。
  2. cmbContent - 这个组合框应该填充从 cmbHeader 中选择的表格内的列

我能够使用以下代码在我的数据库中的表中填充 cmbHeader:

Dim conn As New MySqlConnection
    Dim command As New MySqlCommand
    Dim dt As New DataTable
    conn.ConnectionString = "server=localhost;userid=root;password=NewPass;database=converter"
    Try
        conn.Open()
        dt = conn.GetSchema("TABLES")

        cmbHeader.DataSource = dt
        cmbHeader.DisplayMember = "table_name"
        cmbHeader.ValueMember = "table_name"

        command.Dispose()
        conn.Close()
    Catch ex As Exception

    End Try

现在对于 cmbContent,我的代码中出现错误。我使用此代码:

Private Sub cmbHeader_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbHeader.SelectedIndexChanged, cmbList.SelectedIndexChanged
    Dim conn As New MySqlConnection
    Dim command As New MySqlCommand
    Dim dt As New DataTable
    Dim reader As MySqlDataReader
    conn.ConnectionString = "server=localhost;userid=root;password=NewPass;database=converter"

    conn.Open()
    Dim query As String
    query = "SELECT * FROM '" & cmbHeader.SelectedItem & "'"
    command = New MySqlCommand(query, conn)
    reader = command.ExecuteReader

    cmbList.Items.Clear()

    While reader.Read
        Dim header = reader.GetString("Header")
        Dim content = reader.GetString("Content")
        Dim convert = reader.GetString("Convert")

        cmbList.Items.Add(content)
    End While

    command.Dispose()
    reader.Close()
    conn.Close()
End Sub

这是我使用上面的代码得到的错误图像。

我尝试将查询更改为 "SELECT * FROM '" & cmbHeader.SelectedItem.ToString & "'" 但我得到一个不同的错误。如何根据我在第一个 ComboBox 上选择的内容填充我的第二个 ComboBox?请帮助我卡住了。谢谢。 :)

【问题讨论】:

  • 如何使用单个 qoutes 作为表名?并且您从组合框中获取 selecteditem 而不是选择 selectedvalue 或 selectedtext。

标签: mysql vb.net combobox


【解决方案1】:

替换代码中的以下行,

query = "SELECT * FROM '" & cmbHeader.SelectedItem & "'"

用这条线,

query = "SELECT * FROM " & cmbHeader.SelectedItem.Value & ";"

希望这会奏效。 谢谢。

【讨论】:

  • 这不起作用,先生。它仍然显示相同的错误。
【解决方案2】:

这样查询:

 query = "SELECT * FROM " & cmbHeader.Text '<-- updation
                            OR
 query = "SELECT * FROM " & cmbHeader.SelectedValue '<-- updation

但这不是一个好习惯,因为它会导致sql injection,所以我建议您使用参数化(在这种情况下可以避免injuction,因为它只允许从组合框中选择值。但在一般来说,这不是一个好习惯,这就是为什么我建议像这样)查询如下

    query = "SELECT * FROM ?"
    Dim cmd As New OdbcCommand 
    With cmd
        .CommandType = CommandType.Text
        .CommandText = query
        .Connection = con
        .Parameters.Add(New OdbcParameter(@table,cmbHeader.SelectedItem ))
     End With

【讨论】:

  • 试试我发布的更新
  • 它仍然显示与以前相同的错误。我认为问题出在我的查询语法上?它读取 & 应该只是一个连接。有没有其他方法可以编写我的查询以使其正常工作?
  • 尝试使用参数化查询
【解决方案3】:

对于其他有同样问题的人

我能够弄清楚我的代码出了什么问题。我得到的组合框的值返回“Data.Row.DataRowView”,这就是我的查询失败的原因。我改变了这个:

cmbHeader.DataSource = dt
cmbHeader.DisplayMember = "table_name"
cmbHeader.ValueMember = "table_name"

进入这个:

cmbHeader.ValueMember = "table_name"
cmbHeader.DisplayMember = "table_name"
cmbHeader.DataSource = dt

然后在我的 SelectedIndexChanged 事件中,我使用了这个:

Dim value As String = ""
    value = Convert.ToString(cmbHeader.Text)

    conn.Open()
    Dim query As String
    query = "SELECT * FROM " & value
    command = New MySqlCommand(query, conn)
    'With command
    '    .Parameters.AddWithValue("header", value)
    'End With

    reader = command.ExecuteReader

    cmbList.Items.Clear()

    While reader.Read
        Dim content = reader.GetString("Content")

        cmbList.Items.Add(content)
    End While

    command.Dispose()
    reader.Close()
    conn.Close()

希望这会有所帮助。感谢大家的帮助。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多