PR

[C#][WPF]DataGridの指定セルにフォーカスを移動する方法

C#

DataGridで任意のセルにフォーカスを移動する方法が分からずに悩んだので、簡単にまとめてみました。

DataGridを使って一覧表示していると、ユーザから痒い所に手が届くようにして欲しいという内容の要望が出てくるんですよね。

フォーカスを移動させるというのもそういった要望の一つとして挙がりやすい内容だと思います。

まずはフォーカスをDataGridに移す

まずは、他のコントロールにフォーカスがあることを考慮して、Focus() メソッドで DataGrid 自体にフォーカスを移します。

dataGrid.Focus();

行を選択する

次に SelectedIndex プロパティに対象セルのある行のインデックス(0から始まる値)を設定して行を選択状態にします。

dataGrid.SelectedIndex = row;

セルを選択する

最後に CurrentCell プロパティに移動先セルの情報を設定する。のですが、このプロパティにはDataGridCell ではなく DataGridCellInfo オブジェクトを渡さなければなりません。

設定値は次のようにして生成します。

DataGridCellInfo cellInfo = new DataGridCellInfo(dataGrid.Items[row], dataGrid.Columns[column]);

まとめ

上記3ステップを踏むことで任意のセルにフォーカスを移動することが可能となります。

以下はフォーカス移動用に作った関数です。このままソースを張り付ければ、どのようなプログラムでも利用できるかと思います。

public void DataGridSelectCell(DataGrid dataGrid, int row, int column, bool isBeginEdit = false)
{
    // 指定行/列が存在するかチェック
    if (row < 0 || dataGrid.Items.Count <= row || column < 0 || dataGrid.Columns.Count <= column)
    {
        // 存在しない
        return;
    }

    // 指定セルを選択状態にする
    DataGridCellInfo cellInfo = new DataGridCellInfo(dataGrid.Items[row], dataGrid.Columns[column]);
    dataGrid.Focus();
    dataGrid.SelectedIndex = row;
    dataGrid.CurrentCell = cellInfo;

    // 編集モードに移行
    if (isBeginEdit)
    {
        dataGrid.BeginEdit();
    }
}

補足ですが、上記関数では isBeginEdit という引数を取るようにしています。フォーカス移動後にそのまま編集できる状態にしたいというケースもありますので、そのためのオマケ機能です。

コメント

タイトルとURLをコピーしました