2010-10-12 32 views
52

Tengo un DataGrid, vinculado a la tabla de base de datos, necesito obtener el contenido de la fila seleccionada en DataGrid, por ejemplo, quiero mostrar en MessageBox el contenido de la fila seleccionada.Obtener elemento de fila seleccionado en DataGrid WPF

Ejemplo de DataGrid:

enter image description here

Así que si selecciono la segunda fila, mi MessageBox tiene que mostrar algo como: 646 Jim Biology.

Respuesta

109

Puede usar la propiedad SelectedItem para obtener el objeto seleccionado actualmente, que luego puede convertir en el tipo correcto. Por ejemplo si su cuadrícula de datos está ligada a una colección de objetos de clientes que podría hacer esto:

Customer customer = (Customer)myDataGrid.SelectedItem; 

Alternativamente, usted puede unirse SelectedItem a su clase de origen o el modelo de vista.

<Grid DataContext="MyViewModel"> 
    <DataGrid ItemsSource="{Binding Path=Customers}" 
       SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}"/> 
</Grid>  
+1

¡Gracias, la primera funciona genial! –

+2

¡Gracias, el segundo también funciona muy bien! :) – Sam

+1

El segundo es exactamente lo que estaba buscando. ¡Gracias! – James

15

Si está utilizando el patrón MVVM se puede enlazar un SelectedRecord propiedad de su máquina virtual con SelectedItem de la cuadrícula de datos, de esta manera usted siempre tiene la SelectedValue en que VM. De lo contrario, debe usar la propiedad SelectedIndex de DataGrid.

+0

No consumo MVVM, acabo de empezar con WPF/C# /. RED. Si escribo «ContentDataGrid.SelectedIndex», obtengo el índice de la fila seleccionada en DataGrid, y no necesito indexar, pero el valor real, como «646 Jim Biology». Entonces, ¿cómo puedo obtenerlo? –

+0

Debería considerar usar un objeto enlazado para poder vincular la propiedad SelectedItem de la cuadrícula de datos. En su caso, debería intentar navegar a las propiedades de la cuadrícula de datos para averiguar si almacena la propiedad del elemento seleccionado. – ema

+0

+1. ¡Esa primera oración fue * exactamente * lo que estaba buscando! – TarkaDaal

12
public IEnumerable<DataGridRow> 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 { } 
} 
+1

¡Una solución realmente buena! ¡Muchas gracias! – Mafii

2

Bueno voy a poner solución similar que está trabajando muy bien para mí.

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) 
      { 
      } 
     } 
0

si selecciono la segunda fila -

Dim jason As DataRowView 


    jason = dg1.SelectedItem 

    noteText.Text = jason.Item(0).ToString() 

NoteText será 646. Esto es VB, pero lo entiendo.

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

       } 
      } 
     } 
    } 
} 
+1

¿Puedes explicar tu código? – Rico

2

Esto es bastante simple en este DataGrid dg y la clase de elemento se llena en la cuadrícula de datos y listblock1 es un marco básico.

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

Acabo de descubrir este después de probar la respuesta de Fara pero no funcionó en mi proyecto. Simplemente arrastre la columna desde la ventana Orígenes de datos y suéltela en la etiqueta o en el cuadro de texto.

1

utilicen la clase de modelo para obtener valores de las filas seleccionadas de cuadrícula de datos como,

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

También puede:

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