【问题标题】:Checking if datagridview already exist in another datagridview before inserting using checkbox在使用复选框插入之前检查另一个datagridview中是否已经存在datagridview
【发布时间】:2024-01-15 10:43:01
【问题描述】:

我有两个 datagridview,我正在尝试使用单击按钮时的复选框将 datagridview1 中的值插入到 datagridview2。

For i As Integer = DataGridView1.Rows.Count - 1 To 0 Step -1

        Dim c As Boolean
        c = DataGridView1.Rows(i).Cells(0).Value

        If c = True Then
            With DataGridView1.Rows(i)
                DataGridView2.Rows.Insert(0, .Cells(0).Value, .Cells(1).Value, .Cells(2).Value, .Cells(3).Value, .Cells(4).Value, .Cells(5).Value)
            End With
        End If

    Next

我的代码每次插入时都会插入数据。我想防止在 datagridview2 上插入相同的数据。正如您在下图中看到的那样,每次我尝试插入相同的复选框时,我都可以多次添加它。 太感谢了。

这就是我填充 datagridview1 的方式。

 Sub dgv1_SubjectList()
    query = "SELECT subject_id AS '#', subject_name AS 'Descriptive Title', subject_units AS 'Units', sem AS 'Semester', year_level AS 'Year Level' " & _
                " FROM subject WHERE course = '" & cmb_Course.Text & "' AND CURRICULUM = '" & curriculum & "' "
    da = New MySqlDataAdapter(query, myconn)
    da.Fill(ds, "subject")
    DataGridView1.DataSource = ds.Tables(0)
    DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)
End Sub

在 datagridview2 上,我直接在 datagridview2 中添加空列。

谢谢。抱歉更新晚了。

【问题讨论】:

  • 请说明您是如何设置datagridview的数据源,或者首先添加行
  • @Mr.Tripodi 为最新的更新。我如何填充我的数据网格视图
  • 看起来你可以通过从datagridview1中删除行来解决问题,然后你不能将它添加到datagridview2。我还假设这就是您首先以相反顺序遍历行的原因,您打算删除该行吗?

标签: vb.net checkbox datagridview


【解决方案1】:

我已尽力重现您的环境。

        DataGridView1.AllowUserToAddRows = True
    DataGridView2.AllowUserToAddRows = True
    DataGridView1.Rows.Insert(DataGridView1.Rows.Count - 1, True, "Row1Col1", "Row1Col2", "Row1Col3", "Row1Col4", "Row1Col5", "Row1Col6")
    DataGridView1.Rows.Insert(DataGridView1.Rows.Count - 1, True, "Row2Col1", "Row2Col2", "Row2Col3", "Row2Col4", "Row2Col5", "Row2Col6")

    DataGridView2.Rows.Insert(DataGridView2.Rows.Count - 1, False, "Row1Col1", "Row1Col2", "Row1Col3", "Row1Col4", "Row1Col5", "Row1Col6")

    For i As Integer = DataGridView1.Rows.Count - 2 To 0 Step -1

        If DataGridView1.Rows(i).Cells(0).Value Then
            Dim AlreadyInGrid As Boolean = False
            Dim ColumnsCount As Integer = DataGridView1.Columns.GetColumnCount(DataGridViewElementStates.Displayed)
            For j As Integer = DataGridView1.Rows.Count - 2 To 0 Step -1
                For k As Integer = 1 To ColumnsCount - 1
                    If DataGridView1.Rows(i).Cells(k).Value <> DataGridView2.Rows(j).Cells(k).Value Then Exit For
                    AlreadyInGrid = (k = ColumnsCount - 1)
                Next
                If AlreadyInGrid Then Exit For
            Next

            If Not AlreadyInGrid Then
                With DataGridView1.Rows(i)
                    DataGridView2.Rows.Insert(DataGridView2.Rows.Count - 1, False, .Cells(1).Value, .Cells(2).Value, .Cells(3).Value, .Cells(4).Value, .Cells(5).Value, .Cells(6).Value)
                End With
            End If

        End If

    Next

【讨论】:

  • 如果这是预期的结果,请将此标记为正确答案。谢谢!
  • 使用带有主键的数据表并为其添加行会更专业,而不是datagirdview。此外,按索引迭代 dgv 行/列也相当冗长。不过,您似乎知道这一点。
  • 这确实是情境性的,总是取决于环境和需求。如果这是一个小型的个人项目,我认为没有必要使用这样的基础设施。是的,这是一个粗略的草案。它没有优化,因为我只想给作者一个大致的方向。我们都从某个地方开始^^
  • 我相信你把她送错了方向,但我之前就错了。你是对的,这是情境性的,也许这是一项任务,而你只是给了她答案。这通常就是为什么我试图在这样的事情上找到更多的拼图。
【解决方案2】:

在我看来,您似乎想移动该行,如果是这种情况,您不必担心检查它是否已经存在,因为它无法再次尝试添加它。

        Public Class Form1
            Dim ds As New DataSet
            Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
                'Begin sample setup


                ds.Tables.Add(New DataTable With {.TableName = "Table1"})
                With ds.Tables(0)
                    .Columns.Add("Select", GetType(Boolean))
                    .Columns.Add("ID", GetType(Integer))
                    .Columns.Add("Column2", GetType(String))
                    .Rows.Add(False, 1, "test1")
                    .Rows.Add(False, 2, "test2")
                    .Rows.Add(False, 3, "test3")
                    .Rows.Add(False, 4, "test4")
                End With

                Dim dt As DataTable = ds.Tables(0).Clone
                dt.TableName = "Table2"

                ds.Tables.Add(dt)
                DataGridView1.DataSource = ds.Tables(0)
                DataGridView2.DataSource = ds.Tables(1)
                'end sample setup
            End Sub

            Private Sub ButtonAddToDT2_Click(sender As Object, e As EventArgs) Handles ButtonAddToDT2.Click
                Validate()
                Dim SelRows() As DataRow = ds.Tables(0).Select("Select=True")
                For Each DtRow As DataRow In SelRows
                    ds.Tables(1).ImportRow(DtRow)
                    ds.Tables(0).Rows.Remove(DtRow)
                Next
            End Sub

        End Class

如果您不打算删除该行并且您确实想查看该行是否存在于 datagridview2 中,请告诉我,我们可以对此代码进行一些小的修改。

【讨论】:

  • 你觉得这个怎么样?
最近更新 更多