读取 SQL 表单元格值,仅更改 ComboBox.text 而不更改 ComboBox 集合项

Posted

技术标签:

【中文标题】读取 SQL 表单元格值,仅更改 ComboBox.text 而不更改 ComboBox 集合项【英文标题】:Read a SQL table cell value and only change a ComboBox.text without changing the ComboBox collection items 【发布时间】:2021-04-04 20:42:12 【问题描述】:

我正在尝试为微型策略游戏制作军队列表生成器。

我想知道读取 SQL 表格单元格值并将每个单元的值放入 ComboBox.text 字段的正确方法,但仅限于字段中。

不应修改 ComBoBox 集合项(我需要它们保持原样)。我只想用红框值修改 ComboBox.text 值,并为每个单位修改

为了记录,目前,我读取了其他表信息并以这种方式将它们加载到其他组合框中:

Private Sub TextBoxQuantitéUnités_Click(sender As Object, e As EventArgs) Handles TextBoxQuantitéUnités.Click
        Dim connection As New SqlConnection("Data Source=Server;Initial Catalog=OST;Integrated Security=True")
        Dim dt As New DataTable
        Dim sqlquery As String

        connection.Open()

        sqlquery = "select * from liste1 Order By index_unité"

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

        Dim cmd As New SqlCommand(sqlquery, connection)
        Dim reader As SqlDataReader = cmd.ExecuteReader

        ComboBoxNomUnités.DataSource = dt
        ComboBoxNomUnités.DisplayMember = "nom_unité"

        ComboBoxTypeUnités.DataSource = dt
        ComboBoxTypeUnités.DisplayMember = "type_unité"

        ComboBoxAbréviationUnités.DataSource = dt
        ComboBoxAbréviationUnités.DisplayMember = "abréviation_unité"

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

        connection.Close()
    End Sub

非常感谢:-)

The ComboBox.text where I want to load the cell value

The table picture with the framed value I want to load into the cell

The original ComboBox collection I want to keep

编辑 2:

My table structure

Your function call

A short clip of the program in order to understand my problem

如您所见,该功能看起来不错,当我在执行期间检查 ComboBoxQuality 文本时,它看起来不错,但由于某种原因,它并没有改变...

其他的组合框是同步的,你可以在上面的代码中看到。

提前谢谢...

编辑 3:

请求的整个代码:

Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.Sql



Public Class FormOst
    Public Function GetStringFromQuery(ByVal SQLQuery As String) As String
        Dim CN = New SqlConnection("Data Source=Server;Initial Catalog=OST;Integrated Security=True")

        CN.Open()

        Dim StrSql As String = SQLQuery

        Dim cmdReader As SqlCommand = New SqlCommand(StrSql, CN)
        cmdReader.CommandType = CommandType.Text

        Dim SdrReader As SqlDataReader = cmdReader.ExecuteReader(CommandBehavior.CloseConnection)

        GetStringFromQuery = ""
        Try
            With SdrReader
                If .HasRows Then
                    While .Read
                        If .GetValue(0) Is DBNull.Value Then
                            GetStringFromQuery = ""
                        Else
                            If IsDBNull(.GetValue(0).ToString) Then
                                GetStringFromQuery = ""
                            Else
                                GetStringFromQuery = .GetValue(0).ToString
                            End If
                        End If
                    End While
                End If
            End With
            CN.Close()

        Catch ex As Exception
            MsgBox(SQLQuery, MsgBoxStyle.Exclamation, "Error")
        End Try
    End Function




    Private Sub TextBoListeArmées_Click(sender As Object, e As EventArgs) Handles TextBoxListeArmées.Click
        Dim connection As New SqlConnection("Data Source=Server;Initial Catalog=OST;Integrated Security=True")

        Dim dt As New DataTable
        Dim sqlquery As String

        connection.Open()

        sqlquery = "select [nom_unité] + ' | ' + [abréviation_unité] as Unité, index_unité, abréviation_unité, type_unité, qualité_unité, cout_unité from liste1 Order By index_unité"

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

        Dim cmd As New SqlCommand(sqlquery, connection)

        ComboBoxNomUnités.DataSource = dt
        ComboBoxNomUnités.DisplayMember = "Unité"
        ComboBoxNomUnités.AutoCompleteMode = AutoCompleteMode.Append
        ComboBoxNomUnités.AutoCompleteSource = AutoCompleteSource.ListItems

        ComboBoxTypeUnités.DataSource = dt
        ComboBoxTypeUnités.DisplayMember = "type_unité"

        ComboBoxAbréviationUnités.DataSource = dt
        ComboBoxAbréviationUnités.DisplayMember = "abréviation_unité"

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

        LabelListeChargéeVisible.Enabled = True
        LabelListeChargée.Visible = True

        connection.Close()
    End Sub

    Private Sub TextBoxQuantitéUnités_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBoxQuantitéUnités.KeyPress
        If Char.IsDigit(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False Then
            e.Handled = True
        End If
    End Sub

    Private Sub TextBoxQuantitéUnités_TextChanged(sender As Object, e As EventArgs) Handles TextBoxQuantitéUnités.TextChanged
        Try
            TextBoxCoutTotal.Text = (Decimal.Parse(TextBoxQuantitéUnités.Text) * Decimal.Parse(ComboBoxCoutUnité.Text)).ToString()
        Catch ex As Exception
        End Try

    End Sub

    Private Sub ButtonEffacer_Click(sender As Object, e As EventArgs) Handles ButtonEffacer.Click
        TextBoxQuantitéUnités.Text = ""
        ComboBoxNomUnités.Text = ""
        ComboBoxTypeUnités.Text = ""
        ComboBoxQualitéUnités.Text = ""
        ComboBoxAbréviationUnités.Text = ""
        ComboBoxCoutUnité.Text = ""
        TextBoxCoutTotal.Text = ""

    End Sub



    Private Sub LabelListeChargéeVisible_Tick(sender As Object, e As EventArgs) Handles LabelListeChargéeVisible.Tick
        LabelListeChargée.Visible = False
        LabelListeChargéeVisible.Enabled = False
    End Sub

    Private Sub ComboBoxNomUnités_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBoxNomUnités.SelectionChangeCommitted
        Try
            ''  TextBoxCoutTotal.Text = (Decimal.Parse(ComboBoxCoutUnité.SelectedItem.ToString) * Decimal.Parse(TextBoxQuantitéUnités.Text)).ToString
            ComboBoxQualitéUnités.Text = GetStringFromQuery("SELECT qualité_unité FROM liste1 ORDER BY index_unité")
        Catch ex As Exception
        End Try

    End Sub


End Class

【问题讨论】:

【参考方案1】:

通过 sql 查询检索数据的功能

Public Function GetStringFromQuery(ByVal SQLQuery As String) As String
   Dim CN  As New SqlConnection("Data Source=Server;Initial Catalog=OST;Integrated Security=True")


    CN.Open()

    Dim StrSql As String = SQLQuery

    Dim cmdReader As SqlCommand = New SqlCommand(StrSql, CN)
    cmdReader.CommandType = CommandType.Text

    Dim SdrReader As SqlDataReader = cmdReader.ExecuteReader(CommandBehavior.CloseConnection)
    'SdrReader = cmdReader.ExecuteReader
    GetStringFromQuery = ""
    Try
        With SdrReader
            If .HasRows Then
                While .Read
                    If .GetValue(0) Is DBNull.Value Then
                        GetStringFromQuery = ""
                    Else
                        If IsDBNull(.GetValue(0).ToString) Then
                            GetStringFromQuery = ""
                        Else
                            GetStringFromQuery = .GetValue(0).ToString
                        End If
                    End If
                End While
            End If
        End With
        CN.Close()

    Catch ex As Exception
        MsgBox(SQLQuery, MsgBoxStyle.Exclamation, "Error")
    End Try
End Function

检索数据并放入您的组合框文本

ComboBox.Text = GetStringFromQuery("Enter Sql Query here")

【讨论】:

您好,Yat Fei Leong,感谢您的快速答复!好吧,也许我做错了什么,但它不起作用..我将函数放在公共类表单之后,并使用以下行调用该函数:ComboBoxQualitéUnités.Text = GetStringFromQuery("select qualité_unité from liste1 order by index_unité") 但是由于某种原因,它不起作用..(仅供参考,该函数自动将公共属性 ImporLinkCS 添加为字符串) 我已经编辑了代码。您需要将连接更改为您自己的,而不是使用我的。 感谢您的回复。我已经这样做了,但它不起作用..? 如果您使用 sql server,请尝试使用相同的 sql 使用 sql management studio 查询它是否返回任何值。很可能是sql语句问题 我用新东西编辑了我的第一篇文章(编辑 2)。该功能看起来不错,但由于某种原因,它不起作用。【参考方案2】:

您的 sql 查询问题。 您的查询选择了所有内容,并且您想返回与您的项目相关的 UOM

 Private Sub ComboBoxNomUnités_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBoxNomUnités.SelectionChangeCommitted
    Try
        Dim Product as string = ComboBoxNomUnités.Text
        ComboBoxQualitéUnités.Text = GetStringFromQuery("SELECT qualité_unité FROM liste1 Where Nom_Unité = '" & Product & "'")
    Catch ex As Exception
    End Try

End Sub

【讨论】:

像魅力一样工作。非常感谢你! :-D

以上是关于读取 SQL 表单元格值,仅更改 ComboBox.text 而不更改 ComboBox 集合项的主要内容,如果未能解决你的问题,请参考以下文章

DataGridView ComboBox Column:从下拉列表中选择后更改单元格值?

如何使用 Angular 6 + Handsontable 根据另一个单元格值仅更改一个单元格值?

在 pandas 中读取和写入 csv 会更改单元格值

使用PHP调用JS更改HTML表格单元格值

每次活动单元格更改行时更新单元格值

将 Excel 单元格值插入现有 SQL 表 [重复]