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
相关产品推荐
相关产品推荐

