根据匹配值在文本框中显示 DataGridView 值 - vb.net

Display DataGridView values in text boxes based on matching values - vb.net

我有一个 SQL 查询 returns 2 列值:

country  |  number
NA       |    1
IN       |    2
CN       |    3
DE       |    4

以此类推

我正在尝试执行以下操作之一:

  1. 将这些值分配给我可以复制到 excel 工作簿的变量
  2. 或者只是使用 DGV 作为媒介将值复制到文本框。

例如,我有一个带有国家/地区标签和旁边文本框的表单。我想单击一个按钮并将数据复制到匹配的文本框中。

DGV 编号值,其中 DGV 行值 = CN 将为 3,该值将被复制到 CN 值文本框。

如果您只是将 DGV 用作媒介,而不是实际显示它,请改用字典。使用 SQLcommand(cmd) 输出 SQLDataReader,其中国家代码是键,数字是值。然后它就像:

Dim dc As Dictionary(Of String, String) = New Dictionary(Of String, String)
Dim cmd As SqlCommand = "your query string"
cmd.Connection.ConnectionString = "your con string"
Using sqlrdr As SqlDataReader = cmd.ExecuteReader()
     While (sqlrdr.Read())
          dc.Add(sqlrdr(0), sqlrdr(1))
     End While
End Using

然后直接输出到文本框:

txtNA.Text = dc.Item("NA")

如果您的问题所指的国家/地区是固定的,那么您可以使用如下内容:

首先,使用国家名称命名文本框(txtNA、txtIN、txtCN、...)

然后你可以把这个代码:

    Try
        For i = 0 To DataGridView1.RowCount - 1
            Me.Controls("txt" & DataGridView1.Rows(i).Cells(0).Value.ToString).Text = _
            DataGridView1.Rows(i).Cells(1).Value.ToString()
        Next
    Catch
    End Try

如果通过从数据源 window 中拖动 table 到 ide 来使用 class,则以下内容将不起作用 'as is' =].我们需要将对象不是转换为 DataTable,而是转换为 TableAdapter、DataSet 和 BindingSource 中的 class 定义。

这是一个方法,它从SQL-Server数据库table中读取数据,将数据放入DataTable,数据table成为BindingSource的数据源,BindingSource成为数据网格视图。通过使用 BindingSource,我们现在使用 BindingSource 来访问行数据而不是 DataGridView,并且最好转到数据源而不是用户界面。

BindingSource.Current 是一个 DataRowView,向下钻取到行 属性,然后使用字段语言扩展方法获取当前行的强类型数据(如果有当前行,您会注意到我正在使用)两种形式的断言,首先,我们是否有数据源以及是否填充了数据源,然后我们查看是否确实存在当前行。

从这里我们可以将变量、属性或控件文本设置为当前行的字段值。

注意在表单加载中我寻找一个特定的国家(完全可选),然后如果找到则转到该行。

最重要的是,我喜欢在代码中执行 SQL 时使用 xml 文字,这样就没有字符串连接,我们可以很好地格式化语句。

Public Class Form1
    ''' <summary>
    ''' Permits obtaining row data in DataGridView
    ''' </summary>
    ''' <remarks></remarks>
    Dim bsCountries As New BindingSource

    Public Property Country As String
    Public Property CountryNumber As Integer

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim dt As New DataTable

        Using cn As New SqlClient.SqlConnection With
            {
                .ConnectionString = My.Settings.KarenDevConnectionString
            }
            Using cmd As New SqlClient.SqlCommand With {.Connection = cn}

                ' xml literal to make command text
                cmd.CommandText =
                    <SQL>
                    SELECT [ID],[Country],[Number]
                    FROM [Countries]
                    </SQL>.Value

                cn.Open()

                dt.Load(cmd.ExecuteReader)

                dt.Columns("ID").ColumnMapping = MappingType.Hidden

                bsCountries.DataSource = dt
                DataGridView1.DataSource = bsCountries

                ' let's try and move to a country
                Dim index As Integer = bsCountries.Find("Country", "CN")
                If index > -1 Then
                    bsCountries.Position = index
                End If
            End Using
        End Using
    End Sub
    ''' <summary>
    ''' Put field values into TextBoxes
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DoWork()
        If bsCountries.DataSource IsNot Nothing Then
            If bsCountries.Current IsNot Nothing Then
                Dim row As DataRow = CType(bsCountries.Current, DataRowView).Row
                TextBox1.Text = row.Field(Of String)("Country")
                TextBox2.Text = row.Field(Of Integer)("Number").ToString

                ' we can also do this
                Me.Country = row.Field(Of String)("Country")
                Me.CountryNumber = row.Field(Of Integer)("Number")
            End If
        End If
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        DoWork()
    End Sub
End Class