You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中通过Dapper从Form2勾选DataGridView数据填充Form1的DataTable

VB.NET 跨窗体勾选数据填充问题排查与修复

常见问题点及排查步骤

1. 窗体实例引用错误

如果Form2是通过New Form2()创建,未传递Form1的有效实例,而是在Form2中新建Form1实例,会导致数据填充到不可见的新窗口,而非原Form1。

  • 排查:在Form2的构造函数中检查是否持有原Form1的引用,调试时确认parentForm不为空且是当前显示的Form1实例。

2. DataGridView勾选状态判断错误

常出现的问题包括:

  • 使用SelectedRows而非检查CheckBox列的状态(SelectedRows是鼠标选中行,和勾选框无关)
  • 未排除DataGridView的新行(IsNewRow为True的行)
  • CheckBox列索引或名称错误,导致获取的值为DBNull
  • 排查:调试时查看row.Cells("chkSelect").Value的实际值,用row.Cells("chkSelect").Value IsNot DBNull.Value AndAlso Convert.ToBoolean(row.Cells("chkSelect").Value)做安全判断。

3. DataTable绑定未同步

Form1的DataTable如果是局部变量,或者填充后未重新绑定DataGridView,会导致UI不更新。

  • 排查:确认Form1的DataTable是类级成员变量;填充数据后先解绑再重新绑定(避免DataGridView缓存旧数据)。

4. 跨线程UI操作异常

如果在Form2中直接操作Form1的控件,可能因线程上下文不同导致UI不刷新,需使用Invoke切换到UI线程。


修正后代码示例

Form1 代码

' 类级DataTable,用于存储数据
Private dtMain As New DataTable()

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' 初始化dtMain的列(示例)
    dtMain.Columns.Add("条形码", GetType(String))
    dtMain.Columns.Add("商品名称", GetType(String))
    dgvMain.DataSource = dtMain
End Sub

' 打开Form2的按钮事件
Private Sub btnOpenForm2_Click(sender As Object, e As EventArgs) Handles btnOpenForm2.Click
    ' 将当前Form1实例传递给Form2
    Dim frm2 As New Form2(Me)
    frm2.Show()
End Sub

' 供Form2调用的公共方法,接收勾选的数据
Public Sub AddSelectedData(newRows As List(Of DataRow))
    ' 跨线程安全判断
    If Me.InvokeRequired Then
        Me.Invoke(Sub() AddSelectedData(newRows))
        Return
    End If

    ' 将选中行导入到Form1的DataTable
    For Each row In newRows
        dtMain.ImportRow(row)
    Next

    ' 重新绑定刷新DataGridView
    dgvMain.DataSource = Nothing
    dgvMain.DataSource = dtMain
End Sub

Form2 代码

' 持有Form1的引用
Private parentForm As Form1
' Form2绑定的DataTable(示例)
Private dtForm2 As New DataTable()

Public Sub New(parent As Form1)
    InitializeComponent()
    parentForm = parent
    ' 初始化Form2的DataGridView(示例)
    dtForm2.Columns.Add("chkSelect", GetType(Boolean))
    dtForm2.Columns.Add("条形码", GetType(String))
    dtForm2.Columns.Add("商品名称", GetType(String))
    ' 模拟测试数据
    dtForm2.Rows.Add(False, "12345", "测试商品1")
    dtForm2.Rows.Add(False, "67890", "测试商品2")
    dgvForm2.DataSource = dtForm2
End Sub

' 确认勾选数据的按钮事件
Private Sub btnConfirm_Click(sender As Object, e As EventArgs) Handles btnConfirm.Click
    Dim selectedRows As New List(Of DataRow)

    For Each row As DataGridViewRow In dgvForm2.Rows
        ' 排除新行,检查勾选状态
        If Not row.IsNewRow Then
            Dim isChecked As Boolean = False
            If row.Cells("chkSelect").Value IsNot DBNull.Value Then
                isChecked = Convert.ToBoolean(row.Cells("chkSelect").Value)
            End If

            If isChecked Then
                ' 获取当前行的DataRow
                selectedRows.Add(dtForm2.Rows(row.Index))
            End If
        End If
    Next

    ' 传递数据到Form1
    If selectedRows.Count > 0 Then
        parentForm.AddSelectedData(selectedRows)
        Me.Close()
    End If
End Sub

内容的提问来源于stack exchange,提问作者roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:50:40