绑定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
相关产品推荐
相关产品推荐

