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

C# WinForm DevExpress GridView选中聚焦异常问题排查

DevExpress GridView联动选中异常修复方案

问题场景与异常现象

用C# WinForm开发支付界面,通过GridView1的ODEMEID字段关联GridView2的ODEMEBELGEID字段,实现选中GridView1某行时自动选中GridView2中对应记录。但遇到以下异常:

  • 首次打开窗体后,选中GridView1的第一条记录,GridView2中对应记录不会自动选中
  • 选中GridView1的第二条记录后,GridView2能正常匹配选中;此时再回到选中第一条记录,GridView2也能正常选中对应项
  • 临时解决方式:窗体加载时将ODEMEID设为-1,可规避该问题

问题原因分析

  1. 窗体初始化阶段,GridView1默认选中第一条行,但此时FocusedRowChanged事件可能未触发,或者GridView2的数据尚未完全加载完成,导致同步逻辑未执行
  2. 原代码中SelectAndFocusGridView2Rows方法注释掉了清空原有选中状态的逻辑,首次执行时可能存在残留的选中状态干扰,导致视觉上未显示正确选中

修复后的代码实现

private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
{
    try
    {
        object odemeIdValue = gridView1.GetFocusedRowCellValue("ODEMEID");

        if (odemeIdValue != null && odemeIdValue != DBNull.Value)
        {
            int odemeID = Convert.ToInt32(odemeIdValue); 
            SelectAndFocusGridView2Rows(odemeID); 
        }
        else
        {
            DeselectGridView2Rows(); 
        }
    }
    catch (Exception ex)
    {
        Mesajlar.Hata(ex); 
    }
}

private void SelectAndFocusGridView2Rows(int odemeID)
{
    // 先清空原有选中状态,避免残留干扰
    DeselectGridView2Rows(); 
            
    for (int i = 0; i < gridView2.RowCount; i++)
    {
        var rowValue = (int)gridView2.GetRowCellValue(i, "ODEMEBELGEID");

        if (rowValue == odemeID)
        {
            gridView2.SelectRow(i);
            gridView2.FocusedRowHandle = i;
            // 找到匹配行后提前退出循环,提升效率
            break;
        }
    }
}

private void DeselectGridView2Rows()
{
    for (int i = 0; i < gridView2.RowCount; i++)
    {
        gridView2.UnselectRow(i); 
    }
}

// 新增窗体加载时的初始化逻辑,确保首次选中同步
private void Form_Load(object sender, EventArgs e)
{
    // 确保GridView1和GridView2数据加载完成后,主动触发一次选中同步
    if (gridView1.RowCount > 0)
    {
        gridView1.FocusedRowHandle = 0;
        object odemeIdValue = gridView1.GetFocusedRowCellValue("ODEMEID");
        if (odemeIdValue != null && odemeIdValue != DBNull.Value)
        {
            int odemeID = Convert.ToInt32(odemeIdValue);
            SelectAndFocusGridView2Rows(odemeID);
        }
    }
}

关键修复点

  • 恢复SelectAndFocusGridView2Rows中的DeselectGridView2Rows()调用,确保每次选中前清空原有状态
  • 新增窗体加载事件中的主动同步逻辑,强制触发第一条行的选中同步,解决初始化阶段事件未触发的问题
  • 匹配到对应行后添加break语句,减少不必要的循环遍历

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:00:07