DataGrid WPF에서 선택한 행 항목 가져 오기
내가 가지고 DataGrid
에서, 데이터베이스 테이블에 바인딩, 내가 선택한 행의 콘텐츠를 필요 DataGrid
예를 들어, 난에 표시하려면, MessageBox
선택된 행의 내용.
예 DataGrid
:
따라서 두 번째 행을 선택하면 MessageBox
다음과 같이 표시되어야합니다. 646 Jim Biology .
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
VM 의 속성을 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의 답변을 시도한 후 방금 발견했지만 내 프로젝트에서 작동하지 않았습니다. 데이터 소스 창에서 열을 끌어서 레이블 또는 텍스트 상자에 놓기 만하면됩니다.
Model 클래스를 사용하여 데이터 그리드에서 선택한 행 값을 가져옵니다.
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이지만 얻을 수 있습니다.
MVVM으로 @Krytox 답변
<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
}
}
여기에는 특정 컨텍스트에서 작동하는 많은 답변이 있지만 단순히 선택한 행의 첫 번째 셀의 텍스트 값을 가져 오려고했습니다. 여기에서 받아 들여지는 대답은 나에게 가장 가깝지만 여전히 유형을 만들고 해당 유형으로 행을 캐스팅해야했습니다. 나는 더 간단한 해결책을 찾고 있었고 이것이 내가 생각 해낸 것입니다.
MessageBox.Show(((DataRowView)DataGrid.SelectedItem).Row[0].ToString());
이것은 나에게 선택한 행의 첫 번째 열을 제공합니다. 다른 사람에게 도움이되기를 바랍니다.
참고 URL : https://stackoverflow.com/questions/3913580/get-selected-row-item-in-datagrid-wpf
'Program Tip' 카테고리의 다른 글
API 26 (Android) 용 Gradle 설정 (0) | 2020.12.06 |
---|---|
Ubuntu / Debian에 Mono 3.x 설치 (0) | 2020.12.06 |
AWS Lambda 함수의 이름을 바꿀 수 있습니까? (0) | 2020.12.05 |
인증 헤더가 다른 HttpClient 단일 인스턴스 (0) | 2020.12.05 |
람다의 무한 while 루프 내부의 Thread.sleep에는 'catch (InterruptedException)'가 필요하지 않습니다. (0) | 2020.12.05 |