DataGrid obtenir des lignes sélectionnées dans les " valeurs de la colonne

je vais essayer d'obtenir les valeurs de chaque colonne d'une ligne sélectionnée dans un DataGrid. C'est 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 alors j'obtiens le nombre correct de colonnes mais je ne semble pas pouvoir obtenir les valeurs de ces colonnes dans la rangée sélectionnée. J'ai essayé pendant un certain temps sans succès! Voici mon code 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>

je voudrais idéalement accéder aux données en faisant quelque chose comme rowData.UserID mais je ne peux pas le faire hors. Il y a beaucoup de tutoriels et d'aide pour utiliser DataGridView mais je ne l'utilise pas.

32
demandé sur Dan J 2011-02-25 21:35:07

8 réponses

UPDATED

Pour obtenir les lignes sélectionnées essayer:

IList rows = dg.SelectedItems;

vous devriez alors être en mesure d'obtenir la valeur de la colonne à partir d'un élément de ligne.

OR

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

Puis:

row["ColumnName"];
54
répondu Tony Abrams 2011-02-25 19:00:08

j'ai fait quelque chose de similaire, mais j'utilise la liaison à 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>

donc je peux accéder à mon Contactedecet.Nom dans mon modèle.

6
répondu Philippe Lavoie 2011-02-25 19:12:19

Solution basée sur Tonys réponse:

        DataGrid dg = sender as DataGrid;
        User row = (User)dg.SelectedItems[0];
        Console.WriteLine(row.UserID);
6
répondu Prisoner 2011-02-25 19:28:05

je crois que la raison n'est pas la simple propriété d'accéder aux ligne D'un DataGrid WPF est parce que le mode de sélection D'un DataGrid peut être réglé soit au niveau de la ligne soit au niveau de la cellule. Par conséquent, les propriétés et les événements liés à la sélection sont tous écrits en fonction de la sélection au niveau de la cellule - vous aurez toujours sélectionné cellules quel que soit le mode de sélection de la grille, mais vous n'êtes pas sûr d'avoir un ligne.

je ne savez pas exactement ce que vous essayez de réaliser en manipulant L'événement de CellEditEnding, mais pour obtenir les valeurs de toutes les cellules sélectionnées lorsque vous sélectionnez une rangée, jetez un oeil à la manipulation de la SelectedCellsChanged événement, à la place. Notez surtout les remarques de cet article:

vous pouvez gérer le SelectedCellsChanged de l'événement notifié lors de la collecte de les cellules sélectionnées sont modifiées. Si l' la sélection comprend des lignes complètes, le Sélecteur.L'événement modifié par sélection est également soulevée.

vous pouvez récupérer les cellules ajoutées et RemovedCells de l' SelectedCellsChangedEventArgs in the gestionnaire d'événements.

j'Espère que permet de vous mettre sur la bonne piste. :)

2
répondu Dan J 2011-02-25 19:07:24

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
répondu aminescm 2012-10-19 21:00:38

après des heures à trouver des moyens d'obtenir les données à partir de la ligne sélectionnée sur un contrôle de DataGrid WPF, comme J'utilisais MongoDB. J'ai trouvé ce post et utilisé la réponse de Tony. J'ai revu le code pertinent à mon projet. Peut-être que quelqu'un peut utiliser ça pour avoir 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
répondu f123 2015-02-26 14:18:37

DataGrid obtenir des lignes sélectionnées colonne des valeurs qu'elle peut être l'accès par 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
répondu Ambikesh Mishra 2015-03-23 11:57:10

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 spécifiques des cellules d'un groupe de cellules sélectionnées en utilisant 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
répondu Oswaldo Zarate 2015-09-22 14:01:27