Получить выбранную строку в DataGrid WPF
У меня есть DataGrid
, привязанный к таблице базы данных, мне нужно получить содержимое выбранной строки в DataGrid
, например, я хочу показать в MessageBox
содержимое выбранной строки.
Пример DataGrid
:
![enter image description here]()
Итак, если я выберу вторую строку, мой MessageBox
должен показать что-то вроде: 646 Jim Biology.
Ответы
Ответ 1
Вы можете использовать свойство 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>
Ответ 2
Если вы используете шаблон MVVM, вы можете привязать свойство SelectedRecord
вашей виртуальной машины с помощью SelectedItem
DataGrid, таким образом, у вас всегда есть SelectedValue
в вашей виртуальной машине.
В противном случае вы должны использовать свойство SelectedIndex
DataGrid.
Ответ 3
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 { }
}
Ответ 4
Это довольно просто в этом 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; }
}
Ответ 5
Вы также можете:
DataRowView row = dataGrid.SelectedItem as DataRowView;
MessageBox.Show(row.Row.ItemArray[1].ToString());
Ответ 6
Хорошо, я поставлю аналогичное решение, которое отлично работает для меня.
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)
{
}
}
Ответ 7
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
{
}
}
}
}
}
Ответ 8
Только что открыл это после того, как я попросил Fara ответить, но он не работал над моим проектом. Просто перетащите столбец из окна Источники данных и перейдите в Label или TextBox.
Ответ 9
используйте класс Model для получения значений строк, выбранных из 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);
}
}
Ответ 10
если я выберу вторую строку -
Dim jason As DataRowView
jason = dg1.SelectedItem
noteText.Text = jason.Item(0).ToString()
noteText будет 646. Это VB, но вы его получите.
Ответ 11
@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
}
}
Ответ 12
Здесь много ответов, которые, вероятно, работают в определенном контексте, но я просто пытался получить текстовое значение первой ячейки в выбранной строке. Хотя принятый здесь ответ был самым близким для меня, он все же требовал создания типа и преобразования строки в этот тип. Я искал более простое решение, и вот что я придумал:
MessageBox.Show(((DataRowView)DataGrid.SelectedItem).Row[0].ToString());
Это дает мне первый столбец в выбранной строке. Надеюсь, это поможет кому-то еще.
Ответ 13
Я не могу комментировать напрямую, поэтому я проверил ответ и проголосовал за показ идеи
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 { }
}
Но то, что происходит, - то, что, в то время как я прокручиваю, выбранная строка неоднократно обнаруживается, я думаю из-за подхода ContainerFromItem
.
Возможно ли изменить фон DataGrid
программно, только в коде С#?
Я попытался немного поиграть с выбранным индексом, и это не так просто, как в WindowsForms
. Итак, я попытался выяснить, как выполнить выделение.
Я использую: DataTable
в DataObject
который является источником dataObject.DataTable
элементов DataGrid
является dataObject.DataTable
. Я знаю, что мне нужно выполнить .Background = Brushes."DesiredColor"
в DataGridRow. But я am not sure if there is any relation between
DataGridRow. But я am not sure if there is any relation between
selected index/selected item/
DataGrid selected index/selected item/
SelectedItems 'и свойством Background.