2011-02-25 25 views
28

Sto cercando di ottenere i valori di ciascuna colonna di una riga selezionata in un DataGrid. Questo è quello che ho:DataGrid ottiene i valori delle colonne delle righe selezionate

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

Ma questo non funziona. Se faccio un SelectedCells.Count allora ottengo il numero corretto di colonne ma non riesco a percepire effettivamente i valori di queste colonne nella riga selezionata. Ci ho provato per un po 'senza fortuna! Qui è la mia 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> 

Vorrei idealmente come per accedere ai dati attraverso il fare qualcosa di simile rowData.UserID ma io non riesco a lavorare fuori. Ci sono un sacco di tutorial e aiuto per l'utilizzo di DataGridView ma non sto usando questo.

+0

tag WPF, aggiornati . – Prisoner

+0

Secondo le mie conclusioni, la soluzione più semplice: http://stackoverflow.com/a/42013760/7103438 –

risposta

51

AGGIORNATO

Per ottenere le righe selezionate cercano:

IList rows = dg.SelectedItems; 

Si dovrebbe quindi essere in grado di raggiungere il valore della colonna da un elemento fila.

O

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

Poi:

row["ColumnName"]; 
+0

Avrei dovuto accennare che questo è WPF e non sembra esserci SelectedRows/SelectedRow – Prisoner

+0

La seconda opzione mi dà: Impossibile per lanciare l'oggetto di tipo 'iAdvert_Desktop.User' per digitare 'System.Data.DataRowView' e non riesco a ottenere la prima opzione per lavorare sia: /. Sono abbastanza nuovo di C#. – Prisoner

+0

È possibile modificare DataRowView come utente. Vedi se lo fa. Non ero sicuro di quale fosse il tipo dei tuoi articoli. –

2

Credo che la ragione non c'è struttura semplice per accedere selezionato fila di un WPF DataGrid è perché modalità di selezione di un DataGrid può essere impostato a livello di riga o a livello di cella. Pertanto, le proprietà e gli eventi relativi alla selezione sono tutti scritti in base alla selezione a livello di cella: avrai sempre selezionato celle indipendentemente dalla modalità di selezione della griglia, ma non ti sarà garantita una riga selezionata.

Non so precisamente cosa stai cercando di ottenere gestendo l'evento CellEditEnding, ma per ottenere i valori di tutte le celle selezionate quando selezioni una riga, dai un'occhiata a gestire lo SelectedCellsChanged event, invece. Soprattutto notare il commento in questo articolo:

è possibile gestire l'evento SelectedCellsChanged di essere avvisato quando la raccolta di celle selezionate viene modificato. Se la selezione include righe complete, viene generato anche l'evento Selector.SelectionChanged . .

è possibile recuperare l'AddedCells e RemovedCells dalle SelectedCellsChangedEventArgs nel gestore eventi.

La speranza che ti aiuta a metterti sulla giusta strada. :)

+0

Bene, l'idea di questa parte di codice è consentirmi di: Fare clic per modificare un nome utente, quindi al termine della modifica, voglio salvare il valore in base all'ID utente dell'utente che è ReadOnly. Quindi ho bisogno di ottenere tutte le celle per una riga (beh, solo UserID e UserName in questa istanza). – Prisoner

6

ho fatto una cosa simile, ma io uso vincolante per ottenere l'elemento selezionato:

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

così posso accedere al mio SelectedContact.Name nel mio ViewModel.

6

soluzione in base alla risposta Tonys:

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

vecchia domanda, ma ho cambiato SelectedItems [0] in SelectedItem ... ma questo mi ha aiutato molto! :) upvote! – Arrie

1

Un modo semplice che funziona:

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

Immagino che questo va bene se hai un CheckBox in ognuna delle tue celle. Ofcourse nel numero infinito di situazioni in cui non ... – ouflak

1

Dopo ore di trovare modi su come ottenere i dati dalla riga selezionata su un controllo DataGrid WPF , visto che stavo usando MongoDB. Ho trovato questo post e ho usato la risposta di Tony. Ho rivisto il codice per essere rilevante per il mio progetto. Forse qualcuno può usarlo per farsi un'idea.

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

DataGrid ottiene i valori delle colonne delle righe selezionate a cui è possibile accedere in base al codice riportato di seguito. Qui grid1 è il nome di Gride.

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

ho usato un modo simile per risolvere questo problema utilizzando il sugestion animescm, anzi siamo in grado di ottenere i valori cellule specifiche da un gruppo di celle selezionate utilizzando un elenco di ausiliario:

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); 
     } 
    } 
Problemi correlati