【问题标题】:VB.NET synchronized Combobox and label from SQL ServerVB.NET 从 SQL Server 同步组合框和标签
【发布时间】:2022-01-02 12:54:11
【问题描述】:

我正在尝试将 SQL Server 表的读取与 2 列(nom_unité 和 cout_unité)同步。

第一列 (nom_unité) 将被填充到一个组合框中,我希望第二列 (cout_unité) 与第一个组合框同步到一个标签中(意思是,当我更改组合框值时,标签也应该更改参考到桌子上)。

我可以用 2 个组合框做到这一点:

    Dim connection As New SqlConnection("Data Source=xxx")

    Dim dt As New DataTable
    Dim sqlquery As String

    connection.Open()

    sqlquery = "select * from liste_unités"

    Dim SQL As New SqlDataAdapter(sqlquery, connection)
    SQL.Fill(dt)

    Dim cmd As New SqlCommand(sqlquery, connection)

    ComboBoxC1L1.DataSource = dt
    ComboBoxC1L1.DisplayMember = "nom_unité"

    ComboBox1.DataSource = dt
    ComboBox1.DisplayMember = "cout_unité"

但我不知道如何使用标签(而不是 ComboBox1)。

我相信我可以通过类似的方式实现它:

Dim sqlcmd As New SqlCommand("select * from liste_unités", connection)
Dim myreader As SqlDataReader
        
myreader = sqlcmd.ExecuteReader()
myreader.Read()

If myreader.HasRows Then
   Label1.Text = myreader.Item("cout_unité").ToString
End If

但这只是读取第一行而不是在更改第一个组合框选定值时更改标签值。

如何做最简单最有效的方法?

谢谢你:)

【问题讨论】:

  • 当组合框中的选定项发生更改时会触发一些事件。您需要响应这些事件并根据需要设置标签。并停止懒惰 - 为您的控件提供有用的名称。
  • 好吧,我想感谢您的贡献。控件名称是一个示例...而且我知道 ComboBox 选定项事件,但我不知道其中放入了什么代码。这就是我在这里发帖的原因...

标签: sql-server database vb.net combobox label


【解决方案1】:

由于您已将组合框的数据源分配给包含所需信息的数据表,因此您可以在组合框的值更改时获取该信息。

我开始了一个新的 Windows 窗体项目,并在 Form1 上放置了一个组合框(名为“cbNomUnité”)和一个标签(名为“lblCoutUnité”),并使用了以下代码:

Imports System.Data.SqlClient

Public Class Form1

    Dim connStr As String = "Server=.\SQLEXPRESS;Database=Testing;Trusted_Connection=true;"

    Sub PopulateCB()
        Dim sql = "SELECT nom_unité, cout_unité FROM liste_unités"
        Dim dt As New DataTable

        Using conn As New SqlConnection(connStr),
                da As New SqlDataAdapter(sql, conn)
            da.Fill(dt)
        End Using

        cbNomUnité.DataSource = dt
        cbNomUnité.DisplayMember = "nom_unité"

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbNomUnité.SelectedIndexChanged
        Dim cb = DirectCast(sender, ComboBox)

        If cb.SelectedIndex >= 0 Then
            Dim val = DirectCast(cb.SelectedItem, DataRowView).Row.Field(Of String)("cout_unité")
            lblCoutUnité.Text = val

        End If

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        PopulateCB()

    End Sub

End Class

要获得执行此操作的程序:

(刷新页面再次查看动画。)

【讨论】:

  • 哇,谢谢安德鲁。晶莹剔透 !非常感谢先生!
  • 对不起,我忘了告诉你 cout_unité 是数字。我收到了这个错误:System.InvalidCastException: 'Impossible to cast a 'System.Int32' object into 'System.String'。'
  • 我刚刚用“Of Integer”替换了“Of String”,它就像一个魅力。 :)
  • @Coucouyou 不客气 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多