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

VB.NET实现TabControl多DataGridView选中值传递到Form1主DataGridView

VB.NET实现跨窗体DataGridView数据回填方案

1. 传递Form1选中行到Form2

在Form1中打开Form2时,直接将选中的DataGridViewRow通过构造函数传递给Form2,确保Form2能直接操作或回写数据:

' Form1中,假设主DataGridView名为dgvMain
Private Sub btnOpenForm2_Click(sender As Object, e As EventArgs) Handles btnOpenForm2.Click
    If dgvMain.SelectedRows.Count > 0 Then
        Dim selectedRow As DataGridViewRow = dgvMain.SelectedRows(0)
        Dim frm2 As New Form2(selectedRow)
        frm2.ShowDialog() ' 阻塞Form1直到Form2关闭,确保数据回填即时生效
    Else
        MessageBox.Show("请先选中主表格中的一行")
    End If
End Sub

Form2通过构造函数接收并保存选中行引用:

Public Class Form2
    Private _mainSelectedRow As DataGridViewRow ' 存储Form1的选中行

    Public Sub New(mainRow As DataGridViewRow)
        InitializeComponent()
        _mainSelectedRow = mainRow
    End Sub

2. 处理两次回车键触发逻辑

给所有Tab页内的DataGridView绑定统一的KeyDown事件,统计连续回车次数,达到两次时执行回填:

Private enterPressCount As Integer = 0
Private Sub CommonDgv_KeyDown(sender As Object, e As KeyEventArgs) Handles dgvCriteria1.KeyDown, dgvCriteria2.KeyDown, dgvCriteria3.KeyDown
    If e.KeyCode = Keys.Enter Then
        enterPressCount += 1
        ' 500毫秒内的连续回车才视为有效,避免误触
        Timer1.Interval = 500
        Timer1.Start()

        If enterPressCount = 2 Then
            PerformDataBackfill(DirectCast(sender, DataGridView))
            enterPressCount = 0
            Timer1.Stop()
        End If
        e.Handled = True ' 屏蔽默认回车换行行为
    End If
End Sub

' 超时重置回车计数
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    enterPressCount = 0
    Timer1.Stop()
End Sub

3. 数据回填核心逻辑

根据当前操作的DataGridView所在Tab页,匹配Form1的对应列完成数据回写:

Private Sub PerformDataBackfill(currentDgv As DataGridView)
    If currentDgv.SelectedRows.Count = 0 Then
        MessageBox.Show("请先选中当前表格中的一行")
        Return
    End If

    Dim selectedRow As DataGridViewRow = currentDgv.SelectedRows(0)
    Dim tabPageName As String = DirectCast(currentDgv.Parent, TabPage).Name

    ' 根据Tab页名称匹配对应回填列
    Select Case tabPageName
        Case "tabCriteria1" ' 替换为你的Criteria1标签页Name
            _mainSelectedRow.Cells("Form1_Criteria1").Value = selectedRow.Cells("Criteria1").Value
            _mainSelectedRow.Cells("Form1_DesCriteria1").Value = selectedRow.Cells("DesCriteria1").Value
        Case "tabCriteria2" ' 其他标签页依次类推
            _mainSelectedRow.Cells("Form1_Criteria2").Value = selectedRow.Cells("Criteria2").Value
            _mainSelectedRow.Cells("Form1_DesCriteria2").Value = selectedRow.Cells("DesCriteria2").Value
        Case Else
            MessageBox.Show("未识别的标签页")
    End Select

    ' 可选:回填后关闭Form2,或保留窗口继续操作
    ' Me.Close()
End Sub

替代方案:双击行触发回填

如果不需要两次回车,可改用CellDoubleClick事件简化逻辑:

Private Sub CommonDgv_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvCriteria1.CellDoubleClick, dgvCriteria2.CellDoubleClick
    If e.RowIndex >= 0 Then ' 排除表头点击
        PerformDataBackfill(DirectCast(sender, DataGridView))
    End If
End Sub

注意事项

  • 确保Form1和Form2中DataGridView的列名/索引完全对应,避免赋值错误;
  • 若Form1的DataGridView绑定了DataTable,修改单元格值会自动同步到数据源(需确保列的ReadOnly属性为False);
  • 若使用Show()而非ShowDialog(),需额外处理Form1的刷新逻辑(如调用dgvMain.Refresh())。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:40:02