【C#,WPF】DataGridでキーボードのセル選択を無効化

【C#,WPF】DataGridでキーボードのセル選択を無効化

WPFのデータグリッドでは、マウスクリックによるセル選択の他に、矢印キー・エンターキー・タブキーなどのキーボード操作による選択も可能です。今回はこれらのキー操作を禁止し、マウスによるセル選択のみを有効にする方法を紹介します。

サンプルコード(XAML)

それでは早速、サンプルコードを載せていきます。
サンプルでは「DataGridKeySelectionDisable」というプロジェクトを作成しました。
まずは、XAML側のコードから見ていきます。

<Window x:Class="DataGridKeySelectionDisable.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <!-- キー選択無効のデータグリッド -->
        <DataGrid Name="KeyDisableDataGrid" Margin="0,0,0,0" Width="448" Height="256"
                  HorizontalAlignment="Center" VerticalAlignment="Center" IsReadOnly="True"
                  PreviewKeyDown="KeyDisableDataGrid_PreviewKeyDown"
                  KeyboardNavigation.TabNavigation="None"
                  KeyboardNavigation.ControlTabNavigation="None"
                  KeyboardNavigation.DirectionalNavigation="None"/>
    </Grid>
</Window>

プロジェクト生成時のXAMLに、DataGridを1つ追加しています。
DataGridの「IsReadOnly」はTrueにし、読み取り専用としました。(8行目)
またイベントには「PreviewKeyDown」を設定しています。(9行目)
他に「KeyBoardNavigation」のプロパティを設定しています。(10~12行目)
こちらは、後ほど詳しく解説します。

サンプルコード(C#)

次に、C#側のコードを見ていきます。
まずコンストラクタで「InitializeDataGrid」メソッドを呼び、データグリッドの初期化をします。(29行目)
そして、XAMLで指定した「PreviewKeyDown」イベントの実装をしています。(44~52行目)

using System.Data;
using System.Linq;
using System.Windows;
using System.Windows.Input;

namespace DataGridKeySelectionDisable
{
    /// 
    /// MainWindow.xaml の相互作用ロジック
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // データグリッドの初期化
            this.InitializeDataGrid();
        }

        private void InitializeDataGrid()
        {
            // ダミーデータのテーブルを生成
            DataTable table = new DataTable();
            string[] columns = { "no", "name", "from", "type", "sex", "ability", "item", "memo" };
            table.Columns.AddRange(columns.Select(n => new DataColumn(n)).ToArray());
            table.Rows.Add("1", "mario", "kingdom", "human", "male", "fireball", "star", "hero");
            table.Rows.Add("2", "donkey", "jungle", "animal", "male", "handslap", "banana", "gorilla");
            table.Rows.Add("3", "zelda", "castle", "human", "female", "wisdom", "triforce", "princess");
            this.KeyDisableDataGrid.ItemsSource = table.DefaultView;
        }

        private void KeyDisableDataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            // 特定のキー操作を無効化する
            if (e.Key == Key.Up || e.Key == Key.Down || e.Key == Key.Left ||
                e.Key == Key.Right || e.Key == Key.Enter || e.Key == Key.Tab)
            {
                e.Handled = true;
            }
        }
    }
}

「InitializeDataGrid」メソッドでは、データグリッドに表示するデータを生成しています。(32~42行目)
プログラム実行によりキーボード操作を確認するとき用に、ダミーのDataTableを用意しました。
ダミーデータ作成に関する詳細な解説は、以下の記事をご覧ください。

【C#】DataTableにダミーデータを作成して表示する
データテーブルを生成して画面に表示する際に、実データがまだ準備できていない状況で、先に画面の見た目を確認したいときがあります。 そんなときはダミーデータを作成して、仮のレコードで

要点の解説

上記のソースをビルドし実行すると、マウスクリックでのセル選択は反応し、キーボードによる選択は不可能になっているのが確認できます。
コード内で重要なのは、以下2点です。

  1. KeyboardNavigationのプロパティ指定
  2. PreviewKeyDownのイベント実装

1つずつ説明していきます。

1. KeyboardNavigationのプロパティ指定

XAMLコード「KeyboardNavigation」のプロパティをNoneに指定することで、タブや矢印キーで他コントロールから移動してくるフォーカス選択を無効化できます。
サンプルでは、以下の3つをNoneにしています。

  • TabNavigation:[Tab]キーによるフォーカス
  • ControlTabNavigation:[Ctrl] + [Tab]キーによるフォーカス
  • DirectionalNavigation:[矢印]キーによるフォーカス

2. PreviewKeyDownのイベント実装

上記「KeyboardNavigation」をNoneにすれば、タブキーなどで他コントロールから来る選択を禁止します。
しかし、マウス選択でデータグリッドにフォーカスがあたると、その後はキー操作の選択が有効となります。
そこで「PreviewKeyDown」イベントを使用し、フォーカス後のキー操作も無効化していきます。

C#コード「PreviewKeyDown」イベントで、if文により押されたキーの種類を判定しています。
無効対象キーの場合、KeyEventArgsのHandledプロパティをtrueにし、キー操作をキャンセルします。
サンプルでは「矢印キー(Up, Down, Left, Right)、エンターキー(Enter)、タブキー(Tab)」を、無効対象のキーとしています。
これで他コントロールからのキー操作によるフォーカス移動でのセル選択と、データグリッドにフォーカスが移動後のキー操作によるセル選択、両方を禁止することができました。

ソースコード一式

GitHubに、サンプルプロジェクトのソース一式を公開しています。
GitHub – Kuwayoshi/DataGridKeySelectionDisable
実際に動かしてみたい方などは、上記ページからダウンロードしてください。

まとめ

データグリッドの操作時に、キーボードによるセル選択を無効化する方法を紹介しました。
「KeyboardNavigation」のプロパティは、タブオーダーを指定する際などにも活躍します。
また「PreviewKeyDown」イベントも、データグリッドに限らず様々なキー制御をする際に便利です。
キーボードのUIチェック時、禁止したいキー操作が出てきた場合などに、ご活用ください。


スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください