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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:45:03