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

DataGridView.CurrentRow返回空值,无法获取CID字段值的技术问题

问题分析与解决:DataGridView.CurrentRow返回Nothing的错误

核心问题

你在SaveBtn_Click事件中新建了一个Apptfm窗体实例enter,这个新实例是完全空白的——既没有加载数据,也不存在用户之前选中的行,所以enter.DataGridView1.CurrentRow必然是Nothing,自然无法获取CID字段值。

解决方法

方法1:打开编辑窗体时传递选中行的CID(推荐)

这种方式耦合度低,逻辑更清晰,是WinForms中传递数据的常规做法。

  1. 在编辑窗体(当前包含SaveBtn的窗体)中添加一个公共属性,用于接收CID:
Public Property SelectedCID As Integer
  1. 在Apptfm窗体中打开编辑窗体时,将选中行的CID传递过去:
' Apptfm窗体中打开编辑窗体的示例代码
Private Sub EditBtn_Click(sender As Object, e As EventArgs) Handles EditBtn.Click
    If DataGridView1.CurrentRow IsNot Nothing Then
        Dim editForm As New 当前编辑窗体类名() ' 替换成你的编辑窗体类名
        editForm.SelectedCID = Convert.ToInt32(DataGridView1.CurrentRow.Cells("CID").Value)
        editForm.ShowDialog()
    End If
End Sub
  1. 修改编辑窗体的SaveBtn_Click事件,直接使用传递过来的CID:
Private Sub SaveBtn_Click(sender As Object, e As EventArgs) Handles SaveBtn.Click
    Dim id As Integer = SelectedCID

    Dim connectionString As String = "Server=IT-PC\SQLEXPRESS; Database=Appointments; Integrated Security=true"
    Dim query As String = "UPDATE Customers SET [Plate No.] = @plateno, [Cond No.] = @condno, Customer = @customer, [Cellphone No.] = @cpno, [Tel No.] = @telno, [Unit Model] = @unit, [Job Type] = @jobtype, [S.A.] = @sa, [KMS Reading] = @kms, Remarks = @remarks WHERE CID = @id"

    Using connection As New SqlConnection(connectionString)
        Using cmd As New SqlCommand(query, connection)
            cmd.Parameters.AddWithValue("@plateno", PNtxt.Text)
            cmd.Parameters.AddWithValue("@condno", CStxt.Text)
            cmd.Parameters.AddWithValue("@customer", CNtxt.Text)
            cmd.Parameters.AddWithValue("@cpno", CPtxt.Text)
            cmd.Parameters.AddWithValue("@telno", TPtxt.Text)
            cmd.Parameters.AddWithValue("@unit", UMcbx.Text)
            cmd.Parameters.AddWithValue("@jobtype", JTcbx.Text)
            cmd.Parameters.AddWithValue("@sa", SAcbx.Text)
            cmd.Parameters.AddWithValue("@kms", KMStxt.Text)
            cmd.Parameters.AddWithValue("@remarks", RemarksBtn.Text)
            cmd.Parameters.AddWithValue("@id", id)

            connection.Open()
            Dim rowsAffected As Integer = cmd.ExecuteNonQuery()
            If rowsAffected > 0 Then
                MessageBox.Show("保存成功!")
                Me.Close()
            Else
                MessageBox.Show("记录未保存!")
            End If
        End Using
    End Using
End Sub

方法2:获取已打开的Apptfm窗体实例

如果必须直接访问已打开的Apptfm窗体,可以通过Application.OpenForms查找实例:

Private Sub SaveBtn_Click(sender As Object, e As EventArgs) Handles SaveBtn.Click
    ' 查找已打开的Apptfm窗体实例
    Dim enter As Apptfm = Application.OpenForms.OfType(Of Apptfm)().FirstOrDefault()
    
    If enter IsNot Nothing AndAlso enter.DataGridView1.CurrentRow IsNot Nothing Then
        Dim id As Integer = Convert.ToInt32(enter.DataGridView1.CurrentRow.Cells("CID").Value)

        ' 后续数据库操作代码与原代码一致
        Dim connectionString As String = "Server=IT-PC\SQLEXPRESS; Database=Appointments; Integrated Security=true"
        Dim query As String = "UPDATE Customers SET [Plate No.] = @plateno, [Cond No.] = @condno, Customer = @customer, [Cellphone No.] = @cpno, [Tel No.] = @telno, [Unit Model] = @unit, [Job Type] = @jobtype, [S.A.] = @sa, [KMS Reading] = @kms, Remarks = @remarks WHERE CID = @id"

        Using connection As New SqlConnection(connectionString)
            Using cmd As New SqlCommand(query, connection)
                cmd.Parameters.AddWithValue("@plateno", PNtxt.Text)
                cmd.Parameters.AddWithValue("@condno", CStxt.Text)
                cmd.Parameters.AddWithValue("@customer", CNtxt.Text)
                cmd.Parameters.AddWithValue("@cpno", CPtxt.Text)
                cmd.Parameters.AddWithValue("@telno", TPtxt.Text)
                cmd.Parameters.AddWithValue("@unit", UMcbx.Text)
                cmd.Parameters.AddWithValue("@jobtype", JTcbx.Text)
                cmd.Parameters.AddWithValue("@sa", SAcbx.Text)
                cmd.Parameters.AddWithValue("@kms", KMStxt.Text)
                cmd.Parameters.AddWithValue("@remarks", RemarksBtn.Text)
                cmd.Parameters.AddWithValue("@id", id)

                connection.Open()
                Dim rowsAffected As Integer = cmd.ExecuteNonQuery()
                If rowsAffected > 0 Then
                    MessageBox.Show("保存成功!")
                    Me.Close()
                Else
                    MessageBox.Show("记录未保存!")
                End If
            End Using
        End Using
    Else
        MessageBox.Show("未找到目标窗体或未选中任何行!")
    End If
End Sub

注意事项

  • 优先使用方法1,它避免了窗体间的直接依赖,代码更易维护和扩展。
  • 如果使用方法2,要确保Apptfm窗体已经打开且只有一个实例,否则可能出现查找错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:52:36