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

技术问询:关闭Form1时传递DataGridView值至Form2标签及函数实现

我来帮你搞定这个问题,核心是要在Form1关闭时把DataGridView的选中值正确传到Form2的Label1里,同时修复你现有函数里的几个小问题。

核心需求:关闭Form1时传递值到Form2

要实现关闭Form1时传递数据,我们可以利用Form的FormClosing事件(关闭前触发,能确保数据在窗口关闭前完成传递),同时注意不要每次都新建Form2实例(否则你看不到传递后的效果)。

完整代码示例(Form1的FormClosing事件)

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    ' 先检查是否有选中的行
    If FindItemDataGridView.CurrentRow Is Nothing Then
        MessageBox.Show("请先选中一行数据再关闭窗口!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        ' 如果需要,可以取消关闭:e.Cancel = True
        Return
    End If

    ' 获取DataGridView第一列的选中值,空值安全处理
    Dim selectedItemValue As String = FindItemDataGridView.Item(0, FindItemDataGridView.CurrentRow.Index).Value?.ToString()

    ' 处理Form2的实例:优先找已打开的窗口,没有则新建
    Dim targetForm2 As Form2 = Application.OpenForms.OfType(Of Form2).FirstOrDefault()
    If targetForm2 Is Nothing Then
        targetForm2 = New Form2()
        targetForm2.Show()
    End If

    ' 给Form2的Label1赋值,空值时显示0
    targetForm2.Label1.Text = If(String.IsNullOrEmpty(selectedItemValue), "0", selectedItemValue)
End Sub
修正你的ItemaDataTransfer函数

你的现有函数存在几个问题:比如i > 0会跳过第一行(行索引从0开始)、Catch块未写完、每次新建Form2实例导致看不到效果,下面是修正后的版本:

' 建议返回布尔值表示操作是否成功,方便调用方判断
Private Function ItemaDataTransfer() As Boolean
    Try
        ' 先判断是否有选中行
        If FindItemDataGridView.CurrentRow Is Nothing Then
            MessageBox.Show("请先选择一行数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return False
        End If

        Dim rowIndex As Integer = FindItemDataGridView.CurrentRow.Index
        ' 空值安全获取单元格内容
        Dim itemIdValue As String = FindItemDataGridView.Item(0, rowIndex).Value?.ToString()

        ' 获取已打开的Form2实例,避免重复新建
        Dim purfrm As Form2 = Application.OpenForms.OfType(Of Form2).FirstOrDefault()
        If purfrm Is Nothing Then
            purfrm = New Form2()
            purfrm.Show()
        End If

        ' 赋值并处理空值
        purfrm.Label1.Text = If(String.IsNullOrEmpty(itemIdValue), "0", itemIdValue)
        Return True
    Catch ex As Exception
        MessageBox.Show($"错误信息:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Return False
    End Try
End Function
关键注意点
  • 不要重复新建Form2:如果直接New Entr_PurchaseForm(也就是你的Form2),每次都会创建一个新窗口,之前打开的Form2不会收到数据,所以要用Application.OpenForms查找已打开的实例。
  • 行索引判断要准确:原代码的i > 0会忽略第一行(索引为0的行),应该先判断CurrentRow是否为Nothing,再获取索引。
  • 空值安全处理:用?.ToString()可以避免单元格值为Nothing时抛出NullReferenceException,再用If运算符处理空字符串的情况。
  • 事件选择:如果希望在窗口关闭前完成传递,用FormClosing;如果要在窗口完全关闭后传递,用FormClosed即可。

另外,如果你的需求是关闭Form1后才打开Form2,可以修改Form2的构造函数来接收参数:

' Form2的构造函数修改
Public Class Form2
    Public Sub New(itemId As String)
        InitializeComponent()
        ' 直接在构造时赋值
        Label1.Text = itemId
    End Sub
End Class

' Form1的FormClosing事件修改
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    If FindItemDataGridView.CurrentRow IsNot Nothing Then
        Dim selectedValue As String = FindItemDataGridView.Item(0, FindItemDataGridView.CurrentRow.Index).Value?.ToString()
        Dim finalValue As String = If(String.IsNullOrEmpty(selectedValue), "0", selectedValue)
        ' 传递值给Form2的构造函数
        Dim newForm2 As New Form2(finalValue)
        newForm2.Show()
    End If
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:47