在这里与一些优秀的人合作后,我转换了一个listview,用于显示我的sql表,而不是使用datagrid视图。现在尝试使用网格上的数据我遇到了一些问题,请记住我没有数据网格的经验,而且我正在摸索它。
网格上的最后一列是复选框列。我试图弄清楚如果选中该框时它会选择该行中的所有内容吗?
接下来我要学习的是如何将所选单元格的每个内容保存到变量,比如“cell1”“cell2”等。
在尝试学习如何获取某些数据的过程中,我想出了这一点,但是你必须手动选择每个单元格,如果你点击复选框就会打破它。
TextBox2.Text = ""
Dim FirstValue As Boolean = True
Dim cell As DataGridViewCell
For Each cell In DataGridView1.SelectedCells
If Not FirstValue Then
TextBox2.Text += ", "
End If
TextBox2.Text += cell.Value.ToString()
FirstValue = False
Next
在这里建立一个更好的心理图片的一些信息。数据网格填充了一个包含库房中所有产品的表格,基于用户搜索他们需要的东西,比如工作站上的手套。我希望他们检查代表他们需要的手套的行的方框。该行包含该手套的销售,例如金额,位置,描述等。我希望能够将每个单元格保存到变量中,以便它们可以“添加”到购物车中,然后提交我将要插入到订单sql表中的库存,以便以后提取并完成。
答案 0 :(得分:0)
以下加载将数据模拟到DataTable中,DataTable成为DataGridView的DataSource。 Button1显示了如何获取DataGridview CheckBox被检查的每一行,我放弃了这里用于验证列名存在的任何断言。最后,有一些事情是不需要的,但很高兴知道。
助手
Module BindingSourceExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Function CurrentRow(ByVal sender As BindingSource, ByVal Column As String) As String
Return DirectCast(sender.Current, DataRowView).Row(Column).ToString
End Function
End Module
DataGridView扩展
Module DataGridviewExtensions
<System.Diagnostics.DebuggerStepThrough()> _
<Runtime.CompilerServices.Extension()> _
Public Function ExportSelectedRows(ByVal sender As DataGridView, ByVal ColumnName As String) As String()
Return _
(
From row In sender.Rows.Cast(Of DataGridViewRow)()
Where Not row.IsNewRow AndAlso CType(row.Cells(ColumnName).Value, Boolean) = True
Let RowItem = String.Join(",", Array.ConvertAll(
row.Cells.Cast(Of DataGridViewCell).ToArray,
Function(c As DataGridViewCell) If(c.Value Is Nothing, "", c.Value.ToString)))
Select RowItem).ToArray
End Function
End Module
表单代码,注意我使用了IDE输出窗口中显示的Console.WriteLine
Public Class Form1
Private checkBoxColumnName As String = "AvailableColumn"
Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DataGridView1.AutoGenerateColumns = False
DataGridView1.DataSource = GetMockedData()
End Sub
Private Function GetMockedData() As DataTable
Dim dt As New DataTable()
dt.Columns.Add("Identifier", GetType(Integer))
dt.Columns.Add("Room", GetType(String))
dt.Columns.Add("RoomType", GetType(String))
dt.Columns.Add("Rate", GetType(Decimal))
dt.Columns.Add(checkBoxColumnName, GetType(Boolean))
dt.Columns.Add("Status", GetType(String))
dt.Rows.Add(10, "201A", "Suite", 98.99, False, "Incomplete")
dt.Rows.Add(20, "101A", "Suite", 120.99, False, "Incomplete")
dt.Rows.Add(30, "201B", "Suite", 99.99, False, "Incomplete")
dt.AcceptChanges()
Return dt
End Function
Private Sub DataGridView1SelectAll_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
If TypeOf DataGridView1.CurrentCell Is DataGridViewCheckBoxCell Then
If DataGridView1.Columns(DataGridView1.CurrentCell.ColumnIndex).Name = checkBoxColumnName Then
DataGridView1.EndEdit()
Dim Checked As Boolean = CType(DataGridView1.CurrentCell.Value, Boolean)
If Checked Then
DataGridView1.CurrentRow.Cells("StatusColumn").Value = "Complete"
Else
DataGridView1.CurrentRow.Cells("StatusColumn").Value = "Incomplete"
End If
End If
End If
End Sub
Private Sub cmdClose_Click(sender As Object, e As EventArgs) Handles cmdClose.Click
Close()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim rowArray As String() = DataGridView1.ExportSelectedRows(checkBoxColumnName)
If rowArray.Count > 0 Then
For Each row As String In rowArray
Console.WriteLine(row)
Next
End If
End Sub
End Class
有了这一切,我强烈建议您考虑使用数据源,例如:使用DataTable然后使用for / next迭代行或lambda或linq来获取已检查的行(DataRows)。但如果这不是一个选项,那么请考虑使用上述方法。