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

dataGridView.Rows.Clear()为何无效?如何正确清空DataGridView行

问题描述

我有一个采用默认配置的WinForms DataGridView控件,已开启用户添加行功能,现在需要通过编程方式移除所有行。

执行dataGridView.Rows.Clear()方法后没有达到预期效果,行依旧保留在控件中。我尝试过切换编辑模式、移除数据源、刷新控件,实现代码如下:

dataGridView.EditMode = DataGridViewEditMode.EditProgrammatically;
dataGridView.DataSource = null;
dataGridView.Rows.Clear();
dataGridView.Refresh();
dataGridView.EditMode = DataGridViewEditMode.EditOnKeystroke;

执行完上述代码后,用户添加的行仍然显示,需要找到彻底移除这些行的方法。

补充:控件运行效果截图如下:
DGV

原因说明

问题由两个常见的使用误区导致:

  • 当DataGridView开启AllowUserToAddRows属性(默认开启)时,控件底部会自动生成一行新行占位符,这行不属于用户/代码添加的数据行,不会被Rows.Clear()方法清除,视觉上就像行没有清干净。
  • 你在清空行之前先将DataSource设为null,会断开控件和数据源的同步关联,反而导致绑定生成的行出现显示残留,无法被正常清除。
正确实现方法

根据控件的使用场景选择对应代码即可:

场景1:未绑定数据源,手动向控件添加行

先临时关闭用户新增行功能隐藏占位行,清空完成后再按需恢复功能:

// 临时关闭用户新增行,隐藏自动生成的占位行
dataGridView.AllowUserToAddRows = false;
// 清空所有数据行
dataGridView.Rows.Clear();
// 如需保留用户新增能力,清空后重新开启即可
dataGridView.AllowUserToAddRows = true;

不需要额外修改EditMode,也不需要手动调用Refresh方法。

场景2:绑定了数据源(DataTable、BindingList等)

不要直接操作Rows集合,直接清空绑定的数据源即可,控件会自动同步状态:

// 绑定数据源为DataTable时
if (dataGridView.DataSource is DataTable sourceDt)
{
    sourceDt.Rows.Clear();
}

// 绑定数据源为泛型集合/BindingList时
// if (dataGridView.DataSource is IList sourceList)
// {
//     sourceList.Clear();
// }

注意:绑定模式下不要提前将DataSource设为null,否则会破坏数据同步逻辑,引发显示异常。

内容的提问来源于stack exchange,提问作者TK-421

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 22:24:31