Ottieni l’articolo selezionato in DataGrid WPF

Ho un DataGrid , associato alla tabella Database, ho bisogno di ottenere il contenuto della riga selezionata in DataGrid, ad esempio, voglio mostrare nel contenuto MessageBox della riga selezionata.

Esempio di DataGrid :

inserisci la descrizione dell'immagine qui

Quindi se seleziono la seconda riga, il mio MessageBox deve mostrare qualcosa come: 646 Jim Biology .

È ansible utilizzare la proprietà SelectedItem per ottenere l’object attualmente selezionato, che è quindi ansible eseguire il cast nel tipo corretto. Ad esempio se il tuo DataGrid è associato a un insieme di oggetti Cliente puoi farlo:

 Customer customer = (Customer)myDataGrid.SelectedItem; 

In alternativa puoi associare SelectedItem alla tua class sorgente o ViewModel.

    

Se stai utilizzando il pattern MVVM puoi associare una proprietà SelectedRecord della tua VM con SelectedItem di DataGrid, in questo modo hai sempre il valore SelectedValue nella tua VM. Altrimenti dovresti usare la proprietà SelectedIndex di DataGrid.

 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_lis) { if (single_row.IsSelected == true) { MessageBox.Show("the row no."+single_row .GetIndex ().ToString ()+ " is selected!"); } } } catch { } } 

Questo è piuttosto semplice in questo DataGrid dg e la class dell’object è popolata in datagrid e listblock1 è una cornice di base.

 private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { try { var row_list = (Item)dg.SelectedItem; listblock1.Content = "You Selected: " + row_list.FirstName + " " + row_list.LastName; } catch { } } public class Item { public string FirstName { get; set; } public string LastName { get; set; } } 

Puoi anche:

 DataRowView row = dataGrid.SelectedItem as DataRowView; MessageBox.Show(row.Row.ItemArray[1].ToString()); 

Bene metterò una soluzione simile che sta funzionando bene per me.

  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) { // Do something... // ButtonSaveData.IsEnabled = true; // LabelName.Content = row.Name; } } } } catch (Exception) { } } 
 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 { } } } } } 

Ho appena scoperto questo dopo aver provato la risposta di Fara ma non ha funzionato sul mio progetto. Basta trascinare la colonna dalla finestra Origini dati e rilasciare l’etichetta o il controllo TextBox.

usa la tua class Model per ottenere valori di riga selezionati da datagrid come,

  XDocument xmlDoc = XDocument.Load(filepath); if (tablet_DG.SelectedValue == null) { MessageBox.Show("select any record from list..!", "select atleast one record", MessageBoxButton.OKCancel, MessageBoxImage.Warning); } else { try { string tabletID = ""; /*here i have used my model class named as TabletMode*/ var row_list = (TabletModel)tablet_DG.SelectedItem; tabletID= row_list.TabletID; var items = from item in xmlDoc.Descendants("Tablet") where item.Element("TabletID").Value == tabletID select item; foreach (var item in items) { item.SetElementValue("Instance",row_list.Instance); item.SetElementValue("Database",row_list.Database); } xmlDoc.Save(filepath); MessageBox.Show("Details Updated..!" + Environment.NewLine + "TabletId: " +row_list.TabletID + Environment.NewLine + "Instance:" + row_list.Instance + Environment.NewLine + "Database:" + row_list.Database, "", MessageBoxButton.YesNoCancel, MessageBoxImage.Information); } catch (Exception ex) { MessageBox.Show(ex.StackTrace); } } 

se seleziono la seconda riga –

  Dim jason As DataRowView jason = dg1.SelectedItem noteText.Text = jason.Item(0).ToString() 

noteText sarà 646. Questo è VB, ma tu capisci.

@ Risposta di Krytox con MVVM

  //The binding #region View Model private DataRowView select_request; public DataRowView Select_Request { get { return select_request; } set { select_request = value; OnPropertyChanged("Select_Request"); //INotifyPropertyChange OnSelect_RequestChange();//do stuff } }