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

WinForms中离开窗体后DataGridView行数为0的问题求助

问题原因与解决方案

核心问题:窗体实例引用错误

你遇到的DataGridView“变空”的根本原因是主窗体没有持有frmResults的有效引用:

  • 在SetUpPickBoard方法中,frmPickBoard是局部变量,方法执行完毕后,虽然窗体还在显示,但主窗体没有保存这个实例的引用。
  • 后续你用来操作DataGridView的rsResults,大概率是frmResults的另一个全新实例(而非之前显示的那个)。这个新实例的Load事件可能没触发,或者即使触发了但未被显示,它和你初始化的显示中窗体是完全独立的对象,因此其DataGridView自然没有行列数据,导致索引越界。

修复步骤

1. 在主窗体类级别声明frmResults变量

将原来的局部变量提升为主窗体的类成员,确保整个主窗体生命周期内都能访问同一个实例:

' 在主窗体类的顶部(所有方法之外)声明
Private _pickBoardForm As frmResults

2. 修改SetUpPickBoard方法初始化窗体

用类级别的变量创建并显示窗体,避免局部变量导致的引用丢失:

Private Sub SetUpPickBoard()
    ' 避免重复创建窗体实例
    If _pickBoardForm Is Nothing OrElse _pickBoardForm.IsDisposed Then
        _pickBoardForm = New frmResults
        _pickBoardForm.Show()
    End If
End Sub

3. 用正确的实例引用操作DataGridView

后续选秀操作时,使用类级别的_pickBoardForm变量访问DataGridView,替换原来的rsResults:

_pickBoardForm.dgvPickBoard.Rows(rownumber).Cells(columnnumber).Value = strPickedName

额外优化建议

为了符合封装原则,不建议直接暴露DataGridView控件,可以在frmResults中添加公开方法来更新单元格:

' 在frmResults中添加
Public Sub UpdatePickBoard(rowNum As Integer, colNum As Integer, playerName As String)
    ' 先做索引合法性判断,避免越界
    If rowNum >= 0 AndAlso rowNum < dgvPickBoard.Rows.Count AndAlso _
       colNum >= 0 AndAlso colNum < dgvPickBoard.Columns.Count Then
        dgvPickBoard.Rows(rowNum).Cells(colNum).Value = playerName
    End If
End Sub

主窗体调用时改为:

_pickBoardForm.UpdatePickBoard(rownumber, columnnumber, strPickedName)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:12:47