首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# DevExpress GridView 依欄位值設定焦點列 (FocusedRowHandle) 實作

     編輯:關於C#

情境

在 DevExpress GridView 中,根據特定欄位的值 (如 ID、代碼) 找到對應列並設為焦點列 (高亮、捲動至可視區)。

基本實作

using DevExpress.XtraGrid.Views.Grid;

public void SetFocusedRowByCellValue(GridView view, string columnName, object targetValue)
{
    if (view == null || view.RowCount == 0) return;

    for (int i = 0; i < view.RowCount; i++)
    {
        object cellValue = view.GetRowCellValue(i, columnName);
        if (Equals(cellValue, targetValue))
        {
            view.FocusedRowHandle = i;
            // 確保列在可視範圍 (可選)
            view.MakeRowVisible(i);
            break;
        }
    }
}

進階版:支援多欄位組合鍵、大小寫不敏感、資料類型轉換

public void SetFocusedRow(GridView view, Dictionary keyValues, bool caseInsensitive = true)
{
    if (view == null || keyValues == null || keyValues.Count == 0) return;

    for (int i = 0; i < view.RowCount; i++)
    {
        bool match = true;
        foreach (var kvp in keyValues)
        {
            object cellVal = view.GetRowCellValue(i, kvp.Key);
            object targetVal = kvp.Value;

            if (caseInsensitive && cellVal is string s1 && targetVal is string s2)
            {
                if (!string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase))
                { match = false; break; }
            }
            else if (!Equals(cellVal, targetVal))
            {
                match = false; break;
            }
        }

        if (match)
        {
            view.FocusedRowHandle = i;
            view.MakeRowVisible(i);
            return;
        }
    }
}

效能優化:大量資料時使用 DataSource 直接查詢

public void SetFocusedRowFast(GridView view, string columnName, object targetValue)
{
    // 若 DataSource 為 DataTable/DataView,直接用 FindRows 避免逐列迴圈
    if (view.DataSource is DataView dv)
    {
        dv.Sort = columnName;
        int rowIndex = dv.Find(targetValue);
        if (rowIndex >= 0)
        {
            // DataView 索引需對應到 GridView RowHandle
            view.FocusedRowHandle = view.GetRowHandle(rowIndex);
            view.MakeRowVisible(view.FocusedRowHandle);
        }
    }
    else if (view.DataSource is DataTable dt)
    {
        var rows = dt.Select($"{columnName} = '{targetValue}'"); // 簡單值,實際需參數化
        if (rows.Length > 0)
        {
            int dataIndex = dt.Rows.IndexOf(rows[0]);
            view.FocusedRowHandle = view.GetRowHandle(dataIndex);
            view.MakeRowHandleVisible(view.FocusedRowHandle);
        }
    }
    else
    {
        // 回退逐列搜尋
        SetFocusedRowByCellValue(view, columnName, targetValue);
    }
}

常用輔助方法

  • view.GetRowHandle(int dataSourceIndex):資料來源索引轉 GridView RowHandle。
  • view.GetDataSourceRowIndex(int rowHandle):反向轉換。
  • view.MakeRowVisible(int rowHandle):捲動使列可見。
  • view.FocusedRowHandle = GridControl.AutoFilterRowHandle:焦點移至自動篩選列。
  • view.FocusedRowHandle = GridControl.NewItemRowHandle:焦點移至新增列。

注意事項

  • GetRowCellValue 回傳 object,比較時建議用 Equals 處理 null。
  • 資料分組 (GroupCount > 0) 時,RowHandle 為負數 (群組列),需特殊處理。
  • 虛擬模式 (GridView.OptionsBehavior.EnableCustomization) 下逐列存取較慢,優先用 DataSource 查詢。

參考資源

原文連結:https://www.bianceng.cn/Programming/csharp/201410/45579.htm

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved