77 votes

Obtenir l'élément de ligne sélectionné dans DataGrid WPF

J'ai un DataGrid, lié à une table de base de données, j'ai besoin d'obtenir le contenu de la ligne sélectionnée dans le DataGrid, par exemple, je veux afficher dans une MessageBox le contenu de la ligne sélectionnée.

Exemple de DataGrid:

description de l'image

Donc, si je sélectionne la deuxième ligne, ma MessageBox doit montrer quelque chose comme: 646 Jim Biology.

164voto

Fara Points 3221

Vous pouvez utiliser la propriété SelectedItem pour obtenir l'objet actuellement sélectionné, que vous pouvez ensuite convertir dans le type correct. Par exemple, si votre DataGrid est lié à une collection d'objets Client, vous pourriez faire ceci :

Client client = (Client)myDataGrid.SelectedItem;

Alternativement, vous pouvez lier SelectedItem à votre classe source ou à votre ViewModel.

2 votes

Le deuxième est exactement ce que je cherchais. Merci!

0 votes

Comment obtenir des données de la manière alternative donnée ?

1 votes

Ce deuxième fonctionne très bien, une chose à ajouter qui pourrait être utile pour certains qui commencent tout juste à wpf, comme moi. Dans cette question, nous examinons la classe Customer. Si vous n'avez pas de classe définie pour la ligne DataRowView fonctionne comme le type de données de System.Data.

20voto

ema Points 2346

Si vous utilisez le modèle MVVM, vous pouvez lier une propriété SelectedRecord de votre VM avec SelectedItem du DataGrid, de cette façon vous avez toujours la SelectedValue dans votre VM. Sinon, vous devriez utiliser la propriété SelectedIndex du DataGrid.

0 votes

Je n'utilise pas MVVM, je commence juste avec WPF/C#/.NET. Si j'écris «ContentDataGrid.SelectedIndex», j'obtiens l'index de la ligne sélectionnée dans DataGrid, et je n'ai pas besoin de l'index, mais de la valeur réelle, comme «646 Jim Biologie». Comment puis-je l'obtenir ?

0 votes

Vous devriez envisager d'utiliser un objet lié afin de pouvoir lier la propriété SelectedItem du datagrid. Dans votre cas, vous devriez essayer de naviguer vers les propriétés Datagrid pour savoir si elles stockent la propriété de l'élément sélectionné.

0 votes

+1. Cette première phrase était exactement ce que je cherchais!

13voto

public IEnumerable GetDataGridRows(DataGrid grid)
{
    var itemsSource = grid.ItemsSource as IEnumerable;
    if (null == itemsSource) yield return null;
    foreach (var item in itemsSource)
    {
        var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
        if (null != row) yield return row;
    }
}

private void DataGrid_Details_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    try
    {           
        var row_list = GetDataGridRows(DataGrid_Details);
        foreach (DataGridRow single_row in row_list)
        {
            if (single_row.IsSelected == true)
            {
                MessageBox.Show("la ligne no."+single_row .GetIndex ().ToString ()+ " est sélectionnée!");
            }
        }

    }
    catch { }
}

2voto

Clark Kent Points 5845

Eh bien, je vais mettre une solution similaire qui fonctionne bien pour moi.

 private void DataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                if (DataGrid1.SelectedItem != null)
                {
                    if (DataGrid1.SelectedItem is YouCustomClass)
                    {
                        var row = (YouCustomClass)DataGrid1.SelectedItem;

                        if (row != null)
                        {
                            // Faire quelque chose...

                            //  ButtonSaveData.IsEnabled = true;

                            //  LabelName.Content = row.Name;

                        }
                    }
                }
            }
            catch (Exception)
            {
            }
        }

1voto

Adnan Taj Points 11
private void Fetching_Record_Grid_MouseDoubleClick_1(object sender, MouseButtonEventArgs e)
{
    IInputElement element = e.MouseDevice.DirectlyOver;
    if (element != null && element is FrameworkElement)
    {
        if (((FrameworkElement)element).Parent is DataGridCell)
        {
            var grid = sender as DataGrid;
            if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
            {
                //var rowView = grid.SelectedItem as DataRowView;
                try
                {
                    Station station = (Station)grid.SelectedItem;
                    id_txt.Text =  station.StationID.Trim() ;
                    description_txt.Text =  station.Description.Trim();
                }
                catch
                {

                }
            }
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X