web-dev-qa-db-fra.com

WPF datagrid sélectionné ligne événement cliqué?

Je souhaite exécuter du code lorsqu'une ligne sélectionnée du WPF DataGrid est double-cliquée. Je sais que la grille de données comporte un événement MouseDoubleClicked et qu'elle comporte également un événement de ligne, mais je ne vois aucun événement pour "ligne sélectionnée double-cliqué" ... 

Pensez-vous qu'il est possible de capturer cet événement d'une manière ou d'une autre? 

32
MadSeb

vous pouvez ajouter le gestionnaire d'événements dans la ItemContainerStyle (qui est le style appliqué à une ligne):

<DataGrid ... >
    <DataGrid.ItemContainerStyle>
        <Style TargetType="DataGridRow">
            <EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
        </Style>
    </DataGrid.ItemContainerStyle>
    ...
</DataGrid>

Ensuite, dans le gestionnaire, vous pouvez vérifier si la ligne est sélectionnée

private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
    // execute some code
}
48
Thomas Levesque

Cette question m'est venue en cherchant une solution et les réponses n'ont pas fonctionné, que ce soit en raison de mon âge ou de ma propre mise en œuvre. Quoi qu'il en soit, voici la solution qui a fonctionné pour moi.

Ajouter l'événement MouseDoubleClick au DataGrid

        <DataGrid x:Name="DatagridMovie"
              Width="Auto"
              CanUserAddRows="False"
              CanUserDeleteRows="True"
              IsReadOnly="true"
              ItemsSource="{Binding}"
              MouseDoubleClick="Row_MouseDoubleClick">

et dans la méthode

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();
                }

Jusqu'à présent, je n'ai remarqué aucun problème avec cela. Cela ne partage pas le problème que d’autres ont, c’est-à-dire qu’un double-clic sur un en-tête ou un espace vide avec une ligne préalablement sélectionnée entraînerait son exécution.

15
Gilgamesh

Vous pouvez essayer le gestionnaire d'événements de cellule modifiée en cours, il ne fonctionne qu'en un clic et ne double-cliquez pas si c'est ce que vous cherchez, car le double-clic peut être utilisé pour lancer la modification de la cellule ou de la ligne entière ou pour tout autre processus:

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);

    }
4
0x01Brain

La ItemContainerStyle n’ayant pas la meilleure solution, proposez d’utiliser la RowStyle:

Dans votre XAML:

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">        
        <EventSetter Event="MouseDoubleClick" Handler="DataGridRow_MouseDoubleClick"/>
    </Style>
</DataGrid.RowStyle>

Dans votre code:

private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    //your logic here
}
0
Darlan Dieterich

Pourquoi n'obtenez-vous pas la propriété Ligne sélectionnée pendant que l'événement DoubleClick se produit et faites-vous quelque chose avec? Si la ligne sélectionnée est nulle, cela signifie qu'aucune ligne n'est sélectionnée. Il suffit donc de renvoyer

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
}
0
Carlo