DataGrid obtiene valores de columna de filas seleccionadas

Estoy tratando de obtener los valores de cada columna de una fila seleccionada en un DataGrid. Esto es lo que tengo:

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

Pero esto no funciona. Si SelectedCells.Count obtendré el número correcto de columnas, pero parece que no puedo obtener los valores de estas columnas en la fila seleccionada. ¡Lo he intentado durante bastante tiempo sin suerte! Aquí está mi XAML:

         

Idealmente me gustaría acceder a los datos haciendo algo como rowData.UserID pero parece que no puedo resolverlo. Hay muchos tutoriales y ayuda para usar DataGridView, pero no los estoy usando.

ACTUALIZADO

Para obtener las filas seleccionadas, intente:

 IList rows = dg.SelectedItems; 

Debería poder obtener el valor de columna desde un elemento de fila.

O

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

Entonces:

 row["ColumnName"]; 

Hice algo similar, pero uso vinculante para obtener el elemento seleccionado:

            

De modo que puedo acceder a mi SelectedContact.Name en mi ViewModel.

Solución basada en la respuesta de Tonys:

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

Creo que la razón por la que no hay una propiedad directa para acceder a la fila seleccionada de un WGT DataGrid es porque el modo de selección de un DataGrid se puede establecer en el nivel de la fila o en el nivel de la celda. Por lo tanto, las propiedades y los eventos relacionados con la selección se escriben con selección de nivel de celda; siempre habrá seleccionado celdas independientemente del modo de selección de cuadrícula, pero no se garantiza que tenga una fila seleccionada.

No sé exactamente lo que está tratando de lograr al manejar el evento CellEditEnding, pero para obtener los valores de todas las celdas seleccionadas cuando selecciona una fila, eche un vistazo al manejo del evento SelectedCellsChanged . Tenga en cuenta especialmente los comentarios en ese artículo:

Puede manejar el evento SelectedCellsChanged para que se le notifique cuando se cambie la colección de celdas seleccionadas. Si la selección incluye filas completas, también se genera el evento Selector.SelectionChanged.

Puede recuperar AddedCells y RemovedCells de SelectedCellsChangedEventArgs en el controlador de eventos.

Espero que te ayude a ponerte en el camino correcto. 🙂

Una manera fácil que funciona:

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

Después de horas de encontrar formas de cómo obtener los datos de la fila seleccionada en un control WPF DataGrid, ya que estaba usando MongoDB. Encontré esta publicación y usé la respuesta de Tony. Revisé el código para que sea relevante para mi proyecto. Tal vez alguien pueda usar esto para tener una 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; } } 

DataGrid obtiene valores de columna de filas seleccionadas a las que se puede acceder mediante el código siguiente. Aquí grid1 es el nombre de Gride.

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

Utilicé una manera similar de resolver este problema usando la sugestión de animescm, de hecho podemos obtener los valores de células específicas de un grupo de celdas seleccionadas usando una lista auxiliar:

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