WPF Datagrid Obtener valor de celda seleccionada

Quiero obtener valor para la celda seleccionada en la cuadrícula de datos, por favor, que alguien diga cómo hacerlo. utilicé el evento cambiado SelectedCell, ¿cómo puedo hacer eso?

dataGrid1.CurrentCell 

Consulte la página de la clase DataGrid en MSDN. Desde esa página:

Selección

De forma predeterminada, toda la fila se selecciona cuando un usuario hace clic en una celda en un DataGrid y un usuario puede seleccionar varias filas. Puede establecer la propiedad SelectionMode para especificar si un usuario puede seleccionar celdas, filas completas o ambas. Establezca la propiedad SelectionUnit para especificar si se pueden seleccionar múltiples filas o celdas, o solo filas o celdas individuales.

Puede obtener información sobre las celdas que se seleccionan de la propiedad SelectedCells . Puede obtener información sobre las celdas cuya selección ha cambiado en SelectedCellsChangedEventArgs del evento SelectedCellsChanged. Llame a los métodos SelectAllCells o UnselectAllCells para seleccionar o anular la selección de todas las celdas de forma programática. Para obtener más información, vea Comportamiento predeterminado del teclado y del mouse en DataGrid Control.

He agregado enlaces a las propiedades relevantes para usted, pero ya no tengo tiempo, así que espero que pueda seguir los enlaces para obtener su solución.

Cuando me enfrenté a este problema, lo DataRowView así: creé un DataRowView , agarré el índice de la columna y luego lo usé en el ItemArray la fila ItemArray

 DataRowView dataRow = (DataRowView)dataGrid1.SelectedItem; int index = dataGrid1.CurrentCell.Column.DisplayIndex; string cellValue = dataRow.Row.ItemArray[index].ToString(); 

Si está seleccionando solo una celda, obtenga contenido de celda seleccionado como este

 var cellInfo = dataGrid1.SelectedCells[0]; var content = cellInfo.Column.GetCellContent(cellInfo.Item); 

Aquí el contenido será el valor de las celdas seleccionadas

Y si está seleccionando varias celdas, puede hacerlo así

 var cellInfos = dataGrid1.SelectedCells; var list1 = new List(); foreach (DataGridCellInfo cellInfo in cellInfos) { if (cellInfo.IsValid) { //GetCellContent returns FrameworkElement var content= cellInfo.Column.GetCellContent(cellInfo.Item); //Need to add the extra lines of code below to get desired output //get the datacontext from FrameworkElement and typecast to DataRowView var row = (DataRowView)content.DataContext; //ItemArray returns an object array with single element object[] obj = row.Row.ItemArray; //store the obj array in a list or Arraylist for later use list1.Add(obj[0].ToString()); } } 

Si SelectionUnit="Cell" prueba esto:

  string cellValue = GetSelectedCellValue(); 

Dónde:

  public string GetSelectedCellValue() { DataGridCellInfo cellInfo = MyDataGrid.SelectedCells[0]; if (cellInfo == null) return null; DataGridBoundColumn column = cellInfo.Column as DataGridBoundColumn; if (column == null) return null; FrameworkElement element = new FrameworkElement() { DataContext = cellInfo.Item }; BindingOperations.SetBinding(element, TagProperty, column.Binding); return element.Tag.ToString(); } 

Parece que no debería ser tan complicado, lo sé …

Editar: Esto no parece funcionar en las columnas de tipo DataGridTemplateColumn . También puede intentar esto si sus filas están compuestas de una clase personalizada y ha asignado una ruta de acceso para miembros de clasificación:

  public string GetSelectedCellValue() { DataGridCellInfo cells = MyDataGrid.SelectedCells[0]; YourRowClass item = cells.Item as YourRowClass; string columnName = cells.Column.SortMemberPath; if (item == null || columnName == null) return null; object result = item.GetType().GetProperty(columnName).GetValue(item, null); if (result == null) return null; return result.ToString(); } 
 //Xaml Code     //C# Code DataRowView row = (DataRowView)grid1.SelectedItem; MessageBox.Show(row["Prescription"].toString() + " " + row["Date"].toString()); 

Como WPF proporciona el enlace en DataGrids, esto debería ser bastante transparente. Sin embargo, el siguiente método solo funciona si ha utilizado SQLDataAdapter y proporcionado una ruta de enlace a sus DataGridColoumns. Por ej. Digamos que la cuadrícula de datos anterior se llama grid1, que ha generado automáticamente columnas establecidas en false, y está utilizando el enlace para enlazar nombres de columna a encabezados. En este caso, utilizamos la variable ‘fila’ de tipo ‘DataRowView’ y almacenamos la fila seleccionada en ella. Ahora, use sus Rutas de enlace y haga referencia a columnas individuales de la fila seleccionada. ¡Espero que esto ayude! ¡Aclamaciones!

PD: Funciona si SelectionUnit = ‘Fila’

Estos son 2 métodos que se pueden usar para tomar un valor de la fila seleccionada

  ///  /// Take a value from a the selected row of a DataGrid /// ATTENTION : The column's index is absolute : if the DataGrid is reorganized by the user, /// the index must change ///  /// The DataGrid where we take the value /// The value's line index /// The value contained in the selected line or an empty string if nothing is selected public static string getDataGridValueAt(DataGrid dGrid, int columnIndex) { if (dGrid.SelectedItem == null) return ""; string str = dGrid.SelectedItem.ToString(); // Take the selected line str = str.Replace("}", "").Trim().Replace("{", "").Trim(); // Delete useless characters if (columnIndex < 0 || columnIndex >= str.Split(',').Length) // case where the index can't be used return ""; str = str.Split(',')[columnIndex].Trim(); str = str.Split('=')[1].Trim(); return str; } ///  /// Take a value from a the selected row of a DataGrid ///  /// The DataGrid where we take the value. /// The column's name of the searched value. Be careful, the parameter must be the same as the shown on the dataGrid /// The value contained in the selected line or an empty string if nothing is selected or if the column doesn't exist public static string getDataGridValueAt(DataGrid dGrid, string columnName) { if (dGrid.SelectedItem == null) return ""; for (int i = 0; i < columnName.Length; i++) if (columnName.ElementAt(i) == '_') { columnName = columnName.Insert(i, "_"); i++; } string str = dGrid.SelectedItem.ToString(); // Get the selected Line str = str.Replace("}", "").Trim().Replace("{", "").Trim(); // Remove useless characters for (int i = 0; i < str.Split(',').Length; i++) if (str.Split(',')[i].Trim().Split('=')[0].Trim() == columnName) // Check if the searched column exists in the dataGrid. return str.Split(',')[i].Trim().Split('=')[1].Trim(); return str; } 

Luché con este durante mucho tiempo! (Usando VB.NET) Básicamente se obtiene el índice de la fila y el índice de la columna de la celda seleccionada, y luego se usa para acceder al valor.

 Private Sub LineListDataGrid_SelectedCellsChanged(sender As Object, e As SelectedCellsChangedEventArgs) Handles LineListDataGrid.SelectedCellsChanged Dim colInd As Integer = LineListDataGrid.CurrentCell.Column.DisplayIndex Dim rowInd As Integer = LineListDataGrid.Items.IndexOf(LineListDataGrid.CurrentItem) Dim item As String Try item = LLDB.LineList.Rows(rowInd)(colInd) Catch Exit Sub End Try End Sub 

Clase final

Bien después de hacer ingeniería inversa y un poco de polvo pixie de reflexión, se puede hacer esta operación en SelectedCells (en cualquier punto) para obtener todo (independientemente de lo seleccionado en una fila o muchas filas) los datos de una a muchas celdas seleccionadas:

 MessageBox.Show( string.Join(", ", myGrid.SelectedCells .Select(cl => cl.Item.GetType() .GetProperty(cl.Column.SortMemberPath) .GetValue(cl.Item, null))) ); 

Intenté esto en campos de texto (cadena) solo aunque un campo DateTime debería devolver un valor al iniciar ToString() . También tenga en cuenta que SortMemberPath no es lo mismo que Header por lo que siempre debe proporcionar la propiedad adecuada para reflejar.

  

Extiendo la solución de Rushi a seguir (lo que me solucionó el rompecabezas)

 var cellInfo = Grid1.SelectedCells[0]; var content = (cellInfo.Column.GetCellContent(cellInfo.Item) as TextBlock).Text; 

también puedes usar esta función.

  public static void GetGridSelectedView(out string tuid, ref DataGrid dataGrid,string Column) { try { // grid selected row values var item = dataGrid.SelectedItem as DataRowView; if (null == item) tuid = null; if (item.DataView.Count > 0) { tuid = item.DataView[dataGrid.SelectedIndex][Column].ToString().Trim(); } else { tuid = null; } } catch (Exception exc) { System.Windows.MessageBox.Show(exc.Message); tuid = null; } }