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

