C# Devexpress GridView搜索后选中聚焦行获取ID错误如何解决
DevExpress GridView 搜索后单条结果取ID错误修复方案
问题根因
- DevExpress GridView 的行句柄(RowHandle)是视图层索引,和底层数据源的索引不存在固定对应关系,执行搜索/过滤操作后,视图层的行句柄会重新排列,如果未对行句柄做有效性校验、或者在视图过滤未完成时执行取值,就会读取到错误的旧数据
- 单条搜索结果场景更容易触发该问题:过滤后视图未完成重绘就执行取值,或者缓存了旧的聚焦行句柄,会误读取过滤前的行数据
修复方案
第一步:增加行有效性校验逻辑
原有代码没有对行句柄的合法性做判断,是取值错误的核心诱因,修改代码如下:
// 先校验聚焦行是否为有效数据行 if (gridView1.FocusedRowHandle >= 0 && gridView1.IsDataRow(gridView1.FocusedRowHandle)) { DataRow dr = gridView1.GetDataRow(gridView1.FocusedRowHandle); // 额外增加空值和DBNull校验,避免抛出空引用异常 if (dr != null && dr["ID"] != DBNull.Value) { vID = dr["ID"].ToString(); } }
第二步:搜索完成后强制刷新视图再取值
如果你的取值逻辑是在搜索按钮点击事件中触发,需要先强制刷新GridView的过滤结果,再执行取值:
// 你的搜索/过滤逻辑执行完成后,先调用刷新方法 gridView1.RefreshData(); // 可选:搜索结果非空时自动聚焦到第一行,避免旧行句柄的干扰 if (gridView1.RowCount > 0) { gridView1.FocusedRowHandle = 0; } // 再执行上面的ID取值逻辑
特殊场景适配
如果你的项目使用了异步搜索、或者Server Mode绑定模式,建议把取值逻辑放到GridView的过滤器变更事件中执行,确保过滤操作完全完成后再读取数据:
// 注册过滤器变更事件,在过滤完成后自动执行取值 gridView1.ColumnFilterChanged += (sender, e) => { if (gridView1.FocusedRowHandle >= 0 && gridView1.IsDataRow(gridView1.FocusedRowHandle)) { DataRow dr = gridView1.GetDataRow(gridView1.FocusedRowHandle); if (dr != null && dr["ID"] != DBNull.Value) { vID = dr["ID"].ToString(); } } };
内容的提问来源于stack exchange,提问作者Oğuzhan Eker
相关产品推荐
相关产品推荐

