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

