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

如何在未绑定数据源的DataGridView中添加未提交空白新行

问题核心原因

无绑定、手动填充的DataGridView开启AllowUserToAddRows = True时,控件末尾显示的带*标记的空白行是内部维护的临时未提交行:仅当该行单元格值被实际修改、行状态变更为Added时,控件才会将其转为正式行,同时生成新的临时未提交行。
你在单元格编辑状态下直接调用Rows.Add()插入正式行,会和控件内部的临时行维护逻辑冲突,且编辑态的渲染层未及时释放,就会出现新行错位、上方出现空白行的问题。仅进入编辑模式不修改值时,控件不会触发临时行的转正式逻辑,自然不会生成新的空白临时行。

可行实现方案

方案1:走控件原生新行逻辑(改动最小)

不需要手动调用Rows.Add(),直接利用控件已生成的临时新行即可:

  • 在自定义Enter键跳转逻辑中,判断当前位置为**最后一列、最后一个正式行(行索引 = DgvGrid.NewRowIndex - 1)**时,不要新增行,直接将光标定位到临时新行的第一列即可
  • 跳转前必须先提交当前单元格的编辑状态,避免渲染错位

参考代码(VB.NET):

' Enter键跳转逻辑分支
If DgvGrid.CurrentCell.ColumnIndex = DgvGrid.ColumnCount - 1 Then
    ' 先提交当前编辑状态
    DgvGrid.EndEdit(DataGridViewDataErrorContexts.Commit)
    
    If DgvGrid.CurrentCell.RowIndex = DgvGrid.NewRowIndex - 1 Then
        ' 直接跳转到控件自带的临时新行第一列,无需手动加行
        DgvGrid.CurrentCell = DgvGrid.Rows(DgvGrid.NewRowIndex).Cells(0)
        DgvGrid.BeginEdit(False)
        Exit Sub
    End If
    ' 其余行正常跳转到下一行第一列/右侧单元格的逻辑保留
End If

该方案完全复用控件原生的新行机制,不会出现行错位问题,哪怕不编辑单元格内容,临时新行也会正常显示。

方案2:关闭原生新增行,全手动控制(最稳定,适配自定义交互)

如果你自定义的按键交互较多,建议直接关闭AllowUserToAddRows属性,完全绕开控件内部的临时行逻辑,所有新行通过手动代码控制,彻底避免状态冲突:

  1. 设置DgvGrid.AllowUserToAddRows = False
  2. 回车跳转到最后一行最后一列时,先提交编辑状态,再调用Rows.Add()插入新行,最后将光标定位到新行第一列即可

参考代码:

If DgvGrid.CurrentCell.ColumnIndex = DgvGrid.ColumnCount - 1 AndAlso DgvGrid.CurrentCell.RowIndex = DgvGrid.Rows.Count - 1 Then
    DgvGrid.EndEdit(DataGridViewDataErrorContexts.Commit)
    Dim newRowIdx As Integer = DgvGrid.Rows.Add()
    DgvGrid.CurrentCell = DgvGrid.Rows(newRowIdx).Cells(0)
    DgvGrid.BeginEdit(False)
    Exit Sub
End If

该方案没有内部临时行的干扰,不会出现错位、空白行问题,Shift+Delete删行、Enter跳转的逻辑都不需要额外调整适配。

避坑提示
  • 所有涉及行新增、单元格跨行列跳转的逻辑执行前,必须调用EndEdit()提交当前编辑状态,否则编辑控件的渲染层不会及时释放,很容易出现视觉上的空白、错位问题
  • 不要在ec_PreviewKeyDown(也就是单元格编辑状态下的按键事件)中直接执行行新增操作,先退出编辑状态再操作,避免状态异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:33:29