Получить выбранный элемент строки в DataGrid WPF
у меня есть DataGrid
, привязанный к таблице базы данных, мне нужно получить содержимое выбранной строки в DataGrid, например, я хочу показать в MessageBox
содержимое выбранной строки.
пример DataGrid
:
так что если я выберу вторую строку, мой MessageBox
должен показать что-то вроде: 646 Jim Biology
.
11 ответов:
вы можете использовать свойство 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>
если вы используете шаблон MVVM, вы можете связать
SelectedRecord
свойство вашей виртуальной машины сSelectedItem
в DataGrid, таким образом у вас всегда естьSelectedValue
в вас VM. В противном случае вы должны использоватьSelectedIndex
свойство DataGrid.
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 { } }
Это довольно просто в этом DataGrid dg и класс элемента заполняется в 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; } }
вы можете:
DataRowView row = dataGrid.SelectedItem as DataRowView; MessageBox.Show(row.Row.ItemArray[1].ToString());
Ну я поставлю подобное решение, которое работает нормально для меня.
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) { } }
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 { } } } } }
просто обнаружил это после того, как я попробовал ответ Fara, но он не работал над моим проектом. Просто перетащите столбец из окна источники данных и перейдите к метке или текстовому полю.
используйте свой класс модели, чтобы получить значения строк, выбранных из 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); } }
если я выберу вторую строку -
Dim jason As DataRowView jason = dg1.SelectedItem noteText.Text = jason.Item(0).ToString()
noteText будет 646. Это VB, но вы это понимаете.
@Krytox ответ с MVVM
<DataGrid Grid.Column="1" Grid.Row="1" Margin="10" Grid.RowSpan="2" ItemsSource="{Binding Data_Table}" SelectedItem="{Binding Select_Request, Mode=TwoWay}" SelectionChanged="DataGrid_SelectionChanged"/>//The binding #region View Model private DataRowView select_request; public DataRowView Select_Request { get { return select_request; } set { select_request = value; OnPropertyChanged("Select_Request"); //INotifyPropertyChange OnSelect_RequestChange();//do stuff } }