トップ回答者
DataGrid上で、右クリックでも行を選択をする方法

質問
-
お世話になっております。
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