在 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;
}
}
}
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