sourcecode

DataGrid WPF에서 선택한 행 항목 가져오기

codebag 2023. 4. 18. 22:37
반응형

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

반응형