You need to enable JavaScript to run this app. 绑定DataSource后GridView行计数与数据源不匹配:Rows.Count为0
优惠活动
大模型
产品
解决方案
定价
更多

绑定DataSource后GridView行计数与数据源不匹配:Rows.Count为0

问题根本原因

你遇到的计数不匹配问题,和数据源本身的完整性无关,本质是DataGridView(含第三方衍生控件)的绑定填充机制滞后于DataSource属性赋值动作,具体触发逻辑如下:

// 你的业务代码片段
dgvServices.DataSource = SQL.DBDS.Tables[0];
if (dgvServices.Rows.Count > 0)
{
    //dgvServices.Rows[0].Selected = true;
    dgvServices.SelectRow(intSelectedRow);
    dgvServices.SelectedIndex = intSelectedRow;
}
  • 核心逻辑特性:对DataSource属性的赋值操作,仅完成"绑定源引用关系设置",并不会立刻同步生成控件对应的UI行集合。不管是原生WinForm DataGridView,还是DevExpress等第三方衍生的Grid控件,Rows集合的填充都需要后续的绑定流程完成:包括解析绑定源的列结构、生成对应列映射、逐行匹配生成UI行实例。这个流程在同步执行流中是滞后于赋值语句的下一行代码的,因此你紧邻赋值语句读取Rows.Count时,行集合还未完成初始化,自然返回0。
  • 高频特殊触发场景:
    • 给控件绑定数据源时,控件本身处于Visible = false的隐藏状态(比如藏在未激活的Tab页、折叠面板内),控件会主动延后所有UI行的填充动作,直到自身变为可见状态时才开始加载行数据
    • 使用第三方Grid控件时,之前调用过BeginUpdate()锁更新但未配套调用EndUpdate(),或者绑定规则触发了内置的实时过滤、排序逻辑,都会进一步延后行集合的初始化时机
    • 绑定流程依赖的消息循环被同步阻塞代码卡住,导致绑定刷新的消息迟迟无法被处理,行填充流程一直挂起
可落地的解决方法
  • 最稳妥的方案:把后续的行选中逻辑,挪到控件的DataBindingComplete事件回调中执行。这个事件触发时代表控件已经完全完成所有绑定流程,Rows集合已经完成全部行的初始化,此时读取的计数、执行的选中操作都能拿到符合预期的结果。
  • 如果使用的是DevExpress等第三方Grid控件,可在给DataSource赋值后,手动调用dgvServices.ForceInitialize()方法,强制控件立刻同步跑完所有绑定初始化流程,之后再读取Rows计数、执行选中逻辑即可拿到正确值。
  • 如果是控件处于隐藏状态导致的延后绑定,可在控件重新变为可见时(比如Tab页激活事件),再执行后续的行读取、选中逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 16:45:03