VB.NET DataGridView后台添加行时CurrentRowIndex不递增问题求助
VB.NET DataGridView 后台添加行时CurrentRow.Index异常的彻底解决方案
针对你遇到的后台代码添加行时DataGridView1.CurrentRow.Index始终为0、CellValueChanged事件总是检查第一行的问题,以下是几个彻底解决的思路:
手动指定当前行(直接修正控件状态)
每次通过代码添加行后,直接将新行的单元格设为当前单元格,强制更新CurrentRow的状态:' 代码添加行的逻辑 Dim newRowIndex As Integer = DataGridView1.Rows.Add() Dim newRow As DataGridViewRow = DataGridView1.Rows(newRowIndex) ' 将新行第一列设为当前单元格 DataGridView1.CurrentCell = newRow.Cells(0)这样后续操作中
CurrentRow.Index就会指向新添加的行。修改CellValueChanged事件逻辑(彻底规避CurrentRow依赖)
放弃使用CurrentRow,直接从事件参数中获取触发变更的行索引,这是最可靠的解决方式:Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged ' 只处理第一列的变更,且排除行头 If e.ColumnIndex = 0 AndAlso e.RowIndex >= 0 Then Dim targetCell = DataGridView1.Rows(e.RowIndex).Cells(0) If String.IsNullOrEmpty(targetCell.Value?.ToString().Trim()) Then ' 执行你的检查逻辑,比如提示 MessageBox.Show($"第{e.RowIndex + 1}行的第一单元格不能为空") End If End If End Sub事件参数
e.RowIndex直接对应触发变更的行,完全不受CurrentRow异常状态的影响。改用数据绑定模式(从根源避免控件状态异常)
如果你的DataGridView没有绑定数据源,建议改为绑定DataTable或BindingList,直接操作数据源添加行,控件会自动同步状态:' 初始化时绑定数据源(示例) Dim dt As New DataTable() dt.Columns.Add("列1") dt.Columns.Add("列2") DataGridView1.DataSource = dt ' 后台添加行时操作数据源 Dim newRow As DataRow = dt.NewRow() dt.Rows.Add(newRow) ' 可选:设置当前行为新添加的行 DataGridView1.CurrentCell = DataGridView1.Rows(dt.Rows.Count - 1).Cells(0)数据绑定模式下,控件的行状态由数据源驱动,能避免手动操作行带来的各种状态不同步问题。
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

