WPF DataGridの選択された行がダブルクリックされたときにコードを実行したい。データグリッドにMouseDoubleClickedイベントがあり、行選択イベントもあることは知っていますが、「選択行ダブルクリック」のイベントは表示されません...
このイベントをどうにかキャプチャすることは可能だと思いますか?
ItemContainerStyle
(行に適用されるスタイル)にイベントハンドラーを追加できます。
<DataGrid ... >
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
</Style>
</DataGrid.ItemContainerStyle>
...
</DataGrid>
次に、ハンドラーで、行が選択されているかどうかを確認できます
private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
// execute some code
}
解決策を探しているときにこの質問が出てきましたが、年齢や自分の実装によるものであっても、答えはうまくいきませんでした。いずれにせよ、ここに私のために働いた解決策があります。
MouseDoubleClickイベントをDataGridに追加します
<DataGrid x:Name="DatagridMovie"
Width="Auto"
CanUserAddRows="False"
CanUserDeleteRows="True"
IsReadOnly="true"
ItemsSource="{Binding}"
MouseDoubleClick="Row_MouseDoubleClick">
そしてメソッドで
private void Row_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
// Ensure row was clicked and not empty space
DataGridRow row = ItemsControl.ContainerFromElement((DataGrid)sender, e.OriginalSource as DependencyObject) as DataGridRow;
if ( row == null ) return;
...
Stuff();
}
これまでのところ、問題はありませんでした。事前に選択された行でヘッダーまたは空のスペースをダブルクリックしても実行されることを意味する、他の人が持っている問題を共有していません。
ダブルクリックはセルまたは行全体の編集または他のプロセスの開始に使用できるため、現在のセル変更イベントハンドラーを試してみてください。
private void datagrid_CurrentCellChanged(object sender, EventArgs e)
{
int selected_index = datagrid.SelectedIndex + 1;
// this is used for debugging and testing.
//MessageBox.Show("The index of the row for the clicked cell is " + selected_index);
}
ItemContainerStyle
には最適なソリューションがありません。RowStyle
を使用することをお勧めします。
XAMLで:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
</Style>
</DataGrid.RowStyle>
あなたのコードで:
private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
//your logic here
}
DoubleClickイベントが発生している間、SelectedRowプロパティを取得して、それを使用してみませんか? SelectedRowがnullの場合、行が選択されていないことを意味するため、単に戻る
private void Grid_DoubleClick(object sender, RoutedEventArgs e)
{
if(grid.SelectedRow == null)
return; // return if there's no row selected
// do something with the Selected row here
}