locked
DataGrid上で、右クリックでも行を選択をする方法 RRS feed

  • 質問

  • お世話になっております。

    DataGrid上で、右クリックをした場合にコンテキストメニューを出すようにしてるのですが、
    コンテキストメニューをMouseOverすると、行からフォーカスが外れてしまい、
    選択していた行がどれかわからなくなってしまうため、
    右クリックでも行を選択できるようにする方法を探しています。

    コンテキストメニューが表示される前に選択行を変更したいので、
    MouseRightButtonUpのイベントが発生したときにMouseLeftButtonDownとUpのイベントを発生させたいのですが、
    イベントの発生のさせ方がわからず困っています。

    初歩的な質問でしたらすみません。
    どうかよろしくお願いいたします。

    2010年7月6日 11:43

回答

  • こんにちは。

    DataGrid上で、MouseRightButtonUp発生時にマウスカーソルがある行
    を選択状態にする、というコードを書いてみました。
    ただし、下記のコードでは、どこでMouseRightButtonDownしても
    MouseRightButtonUpが起きたときにDataGridの行にマウスカーソルがあると
    その行が選択されてしまうことに注意してください。

    private void RegistorEventHandler()
    {
      SampleDataGrid.LoadingRow += new EventHandler<DataGridRowEventArgs>(SampleDataGrid_LoadingRow);
    }
    
    private void SampleDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
      // DataGridの行のMouseButtonイベントに登録。
      // -=を行っているのは、行が複数回ロードされることがあるため、一度抜いてから登録している。
      e.Row.MouseRightButtonDown -= new MouseButtonEventHandler(Row_MouseRightButtonDown);
      e.Row.MouseRightButtonDown += new MouseButtonEventHandler(Row_MouseRightButtonDown);
    
      e.Row.MouseRightButtonUp -= new MouseButtonEventHandler(Row_MouseRightButtonUp);
      e.Row.MouseRightButtonUp += new MouseButtonEventHandler(Row_MouseRightButtonUp);
    }
    
    private void Row_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
      // 右クリックを処理済みとして、デフォルトのコンテキストメニューを出さないようにする。
      // これをやらないと、Row.MouseRightButtonUpが発生しない。
      e.Handled = true;
    }
    
    private void Row_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
    {
      // MouseRightButtonUpが発生した行を選択状態にする。
      DataGridRow row = sender as DataGridRow;
      SampleDataGrid.SelectedIndex = row.GetIndex();
    }
    • 回答としてマーク kzchoco 2010年7月8日 4:58
    2010年7月7日 6:16

すべての返信

  • こんにちは。

    DataGrid上で、MouseRightButtonUp発生時にマウスカーソルがある行
    を選択状態にする、というコードを書いてみました。
    ただし、下記のコードでは、どこでMouseRightButtonDownしても
    MouseRightButtonUpが起きたときにDataGridの行にマウスカーソルがあると
    その行が選択されてしまうことに注意してください。

    private void RegistorEventHandler()
    {
      SampleDataGrid.LoadingRow += new EventHandler<DataGridRowEventArgs>(SampleDataGrid_LoadingRow);
    }
    
    private void SampleDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
      // DataGridの行のMouseButtonイベントに登録。
      // -=を行っているのは、行が複数回ロードされることがあるため、一度抜いてから登録している。
      e.Row.MouseRightButtonDown -= new MouseButtonEventHandler(Row_MouseRightButtonDown);
      e.Row.MouseRightButtonDown += new MouseButtonEventHandler(Row_MouseRightButtonDown);
    
      e.Row.MouseRightButtonUp -= new MouseButtonEventHandler(Row_MouseRightButtonUp);
      e.Row.MouseRightButtonUp += new MouseButtonEventHandler(Row_MouseRightButtonUp);
    }
    
    private void Row_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
      // 右クリックを処理済みとして、デフォルトのコンテキストメニューを出さないようにする。
      // これをやらないと、Row.MouseRightButtonUpが発生しない。
      e.Handled = true;
    }
    
    private void Row_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
    {
      // MouseRightButtonUpが発生した行を選択状態にする。
      DataGridRow row = sender as DataGridRow;
      SampleDataGrid.SelectedIndex = row.GetIndex();
    }
    • 回答としてマーク kzchoco 2010年7月8日 4:58
    2010年7月7日 6:16
  • ご返信ありがとうございます!

    早速試してみたところ、
    private void Row_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
      // 右クリックを処理済みとして、デフォルトのコンテキストメニューを出さないようにする。
      // これをやらないと、Row.MouseRightButtonUpが発生しない。
      e.Handled = true;
    }
    のイベントにはなぜか入らなかったので、このイベントを抜いて実装したのですが
    ちゃんとRow.MouseRightButtonUpのイベントが発生し、
    思っていた通りの動作を実現できました!

    本当にありがとうございました!

    2010年7月8日 4:58