2011-02-25 210 views
28

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

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

Pero esto no funciona. Si hago un SelectedCells.Count, entonces obtengo 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:

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

que lo ideal sería tener acceso a los datos a través de hacer algo así como rowData.UserID pero me parece que no puede resolverlo. Hay muchos tutoriales y ayuda para usar DataGridView, pero no los estoy usando.

+0

etiquetas WPF, actualizados . – Prisoner

+0

Según mis hallazgos, la solución más fácil: http://stackoverflow.com/a/42013760/7103438 –

Respuesta

51

ACTUALIZADO

Para obtener las filas seleccionadas tratan:

IList rows = dg.SelectedItems; 

A continuación, debería ser capaz de llegar al valor de la columna de un elemento de la fila.

O

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

continuación:

row["ColumnName"]; 
+0

Debería haber mencionado que esto es WPF y no parece haber SelectedRows/SelectedRow – Prisoner

+0

La segunda opción me da: Incapaz para convertir el objeto del tipo 'iAdvert_Desktop.User' para escribir 'System.Data.DataRowView' y no puedo obtener la primera opción para que funcione: /. Soy bastante nuevo en C#. – Prisoner

+0

Puede cambiar DataRowView para que sea User. Ve si eso lo hace. No estaba segura de cuál era el tipo de tus artículos. –

2

Creo que la razón no hay ninguna propiedad directa para acceder al seleccionado fila de un WPF DataGrid se debe a que el modo de selección de una cuadrícula de datos puede ser establecer en el nivel de la fila o en el nivel de la celda. Por lo tanto, las propiedades y 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 manejando el evento CellEditEnding, pero para obtener los valores de todas las celdas seleccionadas cuando selecciona una fila, observe el manejo del SelectedCellsChanged event. Especialmente en cuenta las observaciones en ese artículo:

que puede manejar el evento SelectedCellsChanged sea notificado cuando se cambia la colección de celdas seleccionadas. Si la selección incluye filas completas, el evento Selector.SelectionChanged también se genera .

puede recuperar el AddedCells y RemovedCells de los SelectedCellsChangedEventArgs en el manejador de evento.

Espero que te ayuden a encaminarte por el buen camino. :)

+0

Bueno, la idea de este fragmento de código es permitirme: Haga clic para editar un nombre de usuario, luego, cuando termine la edición, quiero guardar el valor basado en el ID de usuario del usuario que es Solo lectura. Entonces necesito obtener todas las celdas para una fila (bueno, solo ID de usuario y Nombre de usuario en esta instancia). – Prisoner

6

me hizo algo similar pero utilizar el enlace para obtener el objeto seleccionado:

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

por lo que puedo acceder a mi SelectedContact.Name en mi modelo de vista.

6

Solución basada en respuesta Tonys:

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

viejo pregunta esto, pero cambié SelectedItems [0] a SelectedItem ... pero esto me ayudó mucho! :) upvote! – Arrie

1

Una manera fácil de 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 
    } 
} 
+0

Supongo que esto está bien si tienes un CheckBox en cada una de tus celdas. Por supuesto en el número infinito de situaciones donde no ... – ouflak

1

Después de horas de búsqueda de maneras de cómo obtener los datos de la fila seleccionada en un control DataGrid WPF , 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; } 
} 
1

DataGrid obtener los valores de la columna de las 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(); 
} 
0

que utiliza una forma similar a resolver este problema mediante la sugerencia animescm, de hecho, podemos obtener los valores de células específicas de un grupo de celdas seleccionadas utilizando 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); 
     } 
    } 
Cuestiones relacionadas