DataGridView.CurrentRow返回空值,无法获取CID字段值的技术问题
问题分析与解决:DataGridView.CurrentRow返回Nothing的错误
核心问题
你在SaveBtn_Click事件中新建了一个Apptfm窗体实例enter,这个新实例是完全空白的——既没有加载数据,也不存在用户之前选中的行,所以enter.DataGridView1.CurrentRow必然是Nothing,自然无法获取CID字段值。
解决方法
方法1:打开编辑窗体时传递选中行的CID(推荐)
这种方式耦合度低,逻辑更清晰,是WinForms中传递数据的常规做法。
- 在编辑窗体(当前包含
SaveBtn的窗体)中添加一个公共属性,用于接收CID:
Public Property SelectedCID As Integer
- 在
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
- 修改编辑窗体的
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
相关产品推荐
相关产品推荐

