WinForms 中 DataGridView 未绑定数据源时直接操作行/单元格,会抛出空引用异常。典型场景:窗体加载时 Grid 为空,点击按钮将 TextBox 数据插入 Grid。

DataGridView 的 Rows 集合依赖于数据源。未设置 DataSource 属性时,Rows.Count = 0,无法通过索引访问或新增行。
' 窗体加载或初始化时执行
Dim dt As New DataTable()
dt.Columns.Add("列名1", GetType(String))
dt.Columns.Add("列名2", GetType(Integer))
' ... 按业务添加所有列
DataGridView1.DataSource = dt
DataGridView1.AutoGenerateColumns = True ' 自动生成列,或手动定义 DataGridViewColumn
Private Sub btnInsert_Click(sender As Object, e As EventArgs) Handles btnInsert.Click
Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
If dt IsNot Nothing Then
Dim row As DataRow = dt.NewRow()
row("列名1") = txtName.Text
row("列名2") = Integer.Parse(txtAge.Text)
dt.Rows.Add(row)
' Grid 自动刷新,无需手动绑定
End If
End Sub
dt.Columns.Add("Price", GetType(Decimal)) 确保数据校验col.ReadOnly = True / col.AutoIncrement = TrueICurrencyManager 按需加载| 错误做法 | 后果 | 正确做法 |
|---|---|---|
直接 DataGridView1.Rows.Add(...) | 无数据源时报错 | 操作底层 DataTable |
每次插入重新 DataSource = dt | 闪烁、丢失选中状态 | 一次绑定,后续仅操作 DataTable |
| 列定义依赖 AutoGenerateColumns | 格式不可控 | 显式定义 DataGridViewColumn |