web-dev-qa-db-fra.com

DataGrid récupère les valeurs de colonne des lignes sélectionnées

J'essaie d'obtenir les valeurs de chaque colonne d'une ligne sélectionnée dans un DataGrid. Voici ce que j'ai

private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    DataGrid dg = sender as DataGrid;
    Console.WriteLine(dg.SelectedCells[0].ToString());
}

Mais ça ne marche pas. Si je fais un SelectedCells.Count, j'obtiens le nombre correct de colonnes, mais il me semble impossible d'obtenir les valeurs de ces colonnes dans la ligne sélectionnée. J'ai essayé pendant un certain temps sans succès! Voici mon XAML:

<Grid>
    <DataGrid CanUserAddRows="True" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Stretch" Margin="12,12,79,0" Name="dataGrid1" VerticalAlignment="Top" Width="389" DataContext="{Binding}" CanUserResizeColumns="False" CanUserResizeRows="False" HorizontalContentAlignment="Stretch" PreviewMouseDoubleClick="dataGrid1_PreviewMouseDoubleClick" CellEditEnding="dataGrid1_CellEditEnding">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding  Path=UserID}"
                                Header="User ID" Width="SizeToHeader" />
            <DataGridTextColumn Binding="{Binding  Path=UserName}"
                                Header="User ID" Width="SizeToHeader" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Idéalement, j'aimerais pouvoir accéder aux données en faisant quelque chose comme rowData.UserID, mais je n'arrive pas à résoudre le problème. Il y a beaucoup de tutoriels et d'aide pour utiliser DataGridView mais je ne l'utilise pas.

33
Prisoner

MIS &AGRAVE; JOUR

Pour obtenir les lignes sélectionnées, essayez:

IList rows = dg.SelectedItems;

Vous devriez alors pouvoir accéder à la valeur de la colonne à partir d'un élément de ligne.

OU

DataRowView row = (DataRowView)dg.SelectedItems[0];

Ensuite:

row["ColumnName"];
59
Tony Abrams

Solution basée sur la réponse de Tonys:

        DataGrid dg = sender as DataGrid;
        User row = (User)dg.SelectedItems[0];
        Console.WriteLine(row.UserID);
7
Prisoner

J'ai fait quelque chose de similaire mais j'utilise la reliure pour obtenir l'élément sélectionné:

<DataGrid Grid.Row="1" AutoGenerateColumns="False" Name="dataGrid"
          IsReadOnly="True" SelectionMode="Single"
          ItemsSource="{Binding ObservableContactList}" 
          SelectedItem="{Binding SelectedContact}">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name"/>
    <DataGridTextColumn Binding="{Binding Path=FamilyName}" Header="FamilyName"/>
    <DataGridTextColumn Binding="{Binding Path=Age}" Header="Age"/>
    <DataGridTextColumn Binding="{Binding Path=Relation}" Header="Relation"/>
    <DataGridTextColumn Binding="{Binding Path=Phone.Display}" Header="Phone"/>
    <DataGridTextColumn Binding="{Binding Path=Address.Display}" Header="Addr"/>
    <DataGridTextColumn Binding="{Binding Path=Mail}" Header="E-mail"/>
  </DataGrid.Columns>
</DataGrid>

Je peux donc accéder à mon nom SelectedContact.Name dans mon ViewModel.

6
Philippe Lavoie

Après des heures passées à trouver des moyens d'obtenir les données de la ligne sélectionnée sur un contrôle WPF DataGrid, car j'utilisais MongoDB. J'ai trouvé ce post et utilisé la réponse de Tony. J'ai révisé le code pour qu'il soit pertinent pour mon projet. Peut-être que quelqu'un peut l'utiliser pour se faire une idée.

private void selectionChanged(object sender, SelectionChangedEventArgs e)
    {
        facultyData row = (facultyData)facultyDataGrid.SelectedItem;
        facultyID_Textbox.Text = row.facultyID;
        lastName_TextBox.Text = row.lastName;
        firstName_TextBox.Text = row.firstName;
        middleName_TextBox.Text = row.middleName;
        age_TextBox.Text = row.age.ToString();
    }

}

class facultyData
{
    public ObjectId _id { get; set; }
    public string facultyID { get; set; }
    public string acadYear { get; set; }
    public string program { get; set; }   
}
1
f123

Un moyen facile qui fonctionne:

private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    foreach (var item in e.AddedCells)
    {
        var col = item.Column as DataGridColumn;
        var fc = col.GetCellContent(item.Item);

        if (fc is CheckBox)
        {
            Debug.WriteLine("Values" + (fc as CheckBox).IsChecked);
        }
        else if(fc is TextBlock)
        {
            Debug.WriteLine("Values" + (fc as TextBlock).Text);
        }
        //// Like this for all available types of cells
    }
}
1
aminescm

DataGrid obtient les valeurs de colonne des lignes sélectionnées auxquelles il est possible d'accéder par le code ci-dessous. Ici, grid1 est le nom de Gride.

private void Edit_Click(object sender, RoutedEventArgs e)
{
    DataRowView rowview = grid1.SelectedItem as DataRowView;
    string id = rowview.Row[0].ToString();
}
1
Ambikesh Mishra

J'ai utilisé une méthode similaire pour résoudre ce problème en utilisant la suggestion animescm. En effet, nous pouvons obtenir les valeurs de cellules spécifiques d'un groupe de cellules sélectionnées à l'aide d'une liste auxiliaire:

private void dataGridCase_SelectionChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        foreach (var item in e.AddedCells)
        {
            var col = item.Column as DataGridColumn;
            var fc = col.GetCellContent(item.Item);
            lstTxns.Items.Add((fc as TextBlock).Text);
        }
    }
0
Oswaldo Zarate