Datagridview复选框选择all - 然后将每个单元格保存到自己的变量中?

时间:2016-04-04 12:35:27

标签: vb.net datagridview

在这里与一些优秀的人合作后,我转换了一个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表中的库存,以便以后提取并完成。

1 个答案:

答案 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)。但如果这不是一个选项,那么请考虑使用上述方法。