2010-10-12 8 views
52

У меня есть DataGrid, привязанный к таблице базы данных, мне нужно получить содержимое выбранной строки в DataGrid, например, я хочу показать в MessageBox содержание выбранной строки.Получить выбранный элемент строки в DataGrid WPF

Пример DataGrid:

enter image description here

Так что, если я выбираю второй ряд, мой MessageBox должен показать что-то вроде: 646 Jim Biology.

ответ

109

Свойство SelectedItem можно использовать для получения выбранного объекта, который затем можно применить к правильному типу. Например, если ваш DataGrid привязан к коллекции объектов Customer вы могли бы сделать это:

Customer customer = (Customer)myDataGrid.SelectedItem; 

В качестве альтернативы вы можете связать SelectedItem к вашему исходному классу или ViewModel.

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

Спасибо, первый отлично работает! –

+2

Спасибо, второй тоже отлично работает! :) – Sam

+1

Второй - именно то, что я искал. Благодаря! – James

15

Если вы используете шаблон MVVM вы можете связать SelectedRecord свойства виртуальной машины с SelectedItem в DataGrid, таким образом, у вас всегда есть SelectedValue в вас VM. В противном случае вы должны использовать свойство DataGrid SelectedIndex.

+0

Я не используйте MVVM, я просто начинаю с WPF/C# /. NET. Если я пишу «ContentDataGrid.SelectedIndex», я получаю индекс выбранной строки в DataGrid, и мне не нужно индексировать, а действительное значение, например «646 Jim Biology». Так как я могу его получить? –

+0

Вам следует рассмотреть возможность использования связанного объекта, чтобы вы могли привязать свойство SelectedItem к datagrid. В вашем случае вы должны попытаться перейти к свойствам Datagrid, чтобы узнать, сохраняет ли он свойство выбранного элемента. – ema

+0

+1.Это первое предложение было именно то, что я искал! – 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

Действительно хорошее решение! Большое спасибо! – Mafii

2

Ну вложу подобное решение, которое работает хорошо для меня.

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

если я выбираю второй ряд -

Dim jason As DataRowView 


    jason = dg1.SelectedItem 

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

noteText будет 646. Это VB, но вы получите его.

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

Можете ли вы объяснить свой код? – Rico

2

Это довольно просто в этом DataGrid. Dg и класс item заполняется в datagrid, а listblock1 - это базовый фрейм.

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

Только что открыл этот вопрос после того, как я попросил ответа Фары, но он не работал над моим проектом. Просто перетащите столбец из окна Источники данных и перейдите в Label или TextBox.

1

использовать класс модели, чтобы получить значения строки, выбранные из DataGrid, как,

 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

Вы также можете:

DataRowView row = dataGrid.SelectedItem as DataRowView; 
MessageBox.Show(row.Row.ItemArray[1].ToString()); 
Смежные вопросы