DataGrid WPF에서 선택한 행 항목 가져오기
나는 가지고 있다DataGrid[ Database ]테이블에 바인드된 경우 선택한 행의 내용을 가져올 필요가 있습니다.DataGrid예를 들어, 에 표시하고 싶다.MessageBox선택한 행의 내용.
의 예DataGrid:

그래서 두 번째 열을 선택하면MessageBox646 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가상 머신의 속성SelectedItem이 방법을 통해 항상 데이터 그리드의SelectedValue가상 머신에 있습니다.그렇지 않으면SelectedIndex데이터 그리드의 속성.
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)
{
}
}
@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
}
}
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
{
}
}
}
}
}
방금 파라의 답변을 시도하고 나서 이것을 발견했지만 내 프로젝트에서 효과가 없었다.데이터 소스 창에서 열을 끌어 레이블 또는 텍스트 상자에 놓기만 하면 됩니다.
모델 클래스를 사용하여 다음과 같은 데이터그램에서 선택한 행 값을 가져옵니다.
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지만, 당신은 이해해요.
여기에는 특정 컨텍스트에서 작동하는 많은 답변이 있지만, 저는 단지 선택한 행의 첫 번째 셀의 텍스트 값을 얻으려고 했을 뿐입니다.여기서 받아들여진 답변이 가장 가까웠지만, 여전히 활자를 만들고 행을 그 활자로 만들어야 했습니다.보다 심플한 솔루션을 찾고 있었습니다.그 결과, 다음과 같이 되었습니다.
MessageBox.Show(((DataRowView)DataGrid.SelectedItem).Row[0].ToString());
그러면 선택한 행의 첫 번째 열이 나타납니다.이게 다른 사람에게 도움이 되길 바라.
난 이런 걸 얻었어요.
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) {
DataGrid dg = (DataGrid)sender;
DataRowView selectedRow = dg.SelectedItem as DataRowView;
if(selectedRow != null) {
txtXXX.Text = selectedRow["xxx"].ToString();
txtYYY.Text = selectedRow["yyy"].ToString();
txtZZZ.Text = selectedRow["zzz"].ToString();
}
}
프론트 코드:
- 모델 네임스페이스 설정
xmlns:viewModel="clr-namespace:CPL3_workstation.MVVM.ModelViews.Tables" - 세트
xmlns:d="http://schemas.microsoft.com/expression/blend/2008",왜냐면d:DataContext="{d:DesignInstance...}
<DataGrid d:DataContext = "{d:DesignInstance viewModel:TestViewModel, IsDesignTimeCreatable = True}"
ItemsSource = "{Binding Rows}"
SelectedItem = "{Binding Selector}">
<DataGrid.Columns>
<DataGridTextColumn
Binding = "{Binding Content1}"
Header = "Column 1" />
<DataGridTextColumn
Binding = "{Binding Content2}"
Header = "Column 2" />
<DataGridTextColumn
Binding = "{Binding Content3}"
Header = "Column 3" />
</DataGrid.Columns>
</DataGrid>
당신의.ViewModel및 그Model이하에 나타냅니다.
namespace CPL3_workstation.MVVM.ModelViews.Tables
{
public class TestViewModel
{
public IEnumerable<TestModel> Rows { get; set; }
public TestModel Selector
{
get => selector;
set => selector = value;
}
private TestModel selector;
public TestViewModel()
{
Rows = new List<TestModel>
{
new TestModel{ Content1 = "one", Content2 = "two", Content3 = "three" },
new TestModel{ Content1 = "one", Content2 = "two", Content3 = "three" },
new TestModel{ Content1 = "one", Content2 = "two", Content3 = "three" },
new TestModel{ Content1 = "one", Content2 = "two", Content3 = "three" }
};
}
}
public class TestModel
{
public string Content1 { get; set; }
public string Content2 { get; set; }
public string Content3 { get; set; }
}
}
보다시피SelectedItem에 구속력이 있다.Selector모델 유형의 속성입니다.
언급URL : https://stackoverflow.com/questions/3913580/get-selected-row-item-in-datagrid-wpf
'sourcecode' 카테고리의 다른 글
| 다른 git 저장소에서 cherry-pick이 가능합니까? (0) | 2023.04.18 |
|---|---|
| 동일한 select 문장에서 count 및 group by를 사용하는 방법 (0) | 2023.04.18 |
| ID 컬럼을 사용한 테이블 작성 방법 (0) | 2023.04.18 |
| C#에서 FindTimeZoneById()와 함께 사용하는 시간대 ID 목록? (0) | 2023.04.18 |
| select 문의 Datetime 열을 UTC에서 로컬 시간으로 변환 (0) | 2023.04.18 |