根据匹配值在文本框中显示 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
以此类推
我正在尝试执行以下操作之一:
- 将这些值分配给我可以复制到 excel 工作簿的变量
- 或者只是使用 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
我有一个 SQL 查询 returns 2 列值:
country | number
NA | 1
IN | 2
CN | 3
DE | 4
以此类推
我正在尝试执行以下操作之一:
- 将这些值分配给我可以复制到 excel 工作簿的变量
- 或者只是使用 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