Получить данные Wpf DataGrid в списке - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть datagrid, и я заполняю его данными из списка.Теперь я хочу вернуть все данные из моего datagrid в список.как я могу ?

<DataGrid Name="InstrumentGrid"
                      VerticalAlignment="Top" HorizontalAlignment="left" 
                      Margin="0,16,0,0" Grid.ColumnSpan="3" Grid.Row="19" Grid.RowSpan="2" 
                      AutoGenerateColumns="False"
                      Width="422" Grid.Column="1">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Binding="{Binding Id}" />
        <DataGridTemplateColumn Header="NCS Date" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <DatePicker BorderThickness="0" Height="20" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Instrument No" Binding="{Binding NcsNo}" />
        <DataGridTextColumn Header="Type" Binding="{Binding Type}" />
        <DataGridTextColumn Header="Bank Name" Width="*" Binding="{Binding BankName}" />
        <DataGridTemplateColumn Header="Action">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <VirtualizingStackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                        <Image Width="10" Margin="5 0 0 0" Height="10" Stretch="Fill" Source="/InstrumentManagement;component/wrongSign.png"></Image>
                    </VirtualizingStackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>  

Загрузка данных в DataGrid

private List<Data> list = new List<Data>();
public VehicleInOutWnd()
{
    InitializeComponent();



    for (int i = 0; i < 2; i++)
    {
        list.Add(new Data()
        {
            Id = i.ToString(),
            BankName = "Bank al habib"+i,
            NcsDate = "23/12/2018",
            InstrumentNo = "234"+i,
            Type = "Type abc"+i
        });
    }

    InstrumentGrid.ItemsSource = list;

}  

Теперь я просто хочу получить все эти данные в DataGrid, как это было в list<Data> вкакой-то другой список.на button функцию щелчка.

Ответы [ 4 ]

0 голосов
/ 28 декабря 2018

Когда вы редактируете ячейку в DataGrid, вы устанавливаете соответствующее свойство класса Data в list.Таким образом, все отредактированные данные уже находятся в list.Просто получите его оттуда, прежде чем очистить исходный список:

var modifiedData = list.ToList(); //creates a copy of the list that contains the modified data
list.Clear(); //clears the original list.
0 голосов
/ 28 декабря 2018

Я предполагаю, что вы хотите получить данные из таблицы данных после их изменения.Если вы свяжете свой первоначальный список List (путая название здесь) с сеткой данных, он всегда будет обновляться без ручного вмешательства.

Самым чистым решением будет использование модели представления.

public class MyViewModel {
    : INotifyPropertyChanged

    public MyViewModel()
    {
        _myDataList = new List<Data>();
        for (int i = 0; i < 2; i++)
        {
            _myDataList.Add(new Data()
            {
                Id = i.ToString(),
                BankName = "Bank al habib"+i,
                NcsDate = "23/12/2018",
                InstrumentNo = "234"+i,
                Type = "Type abc"+i
            });
        }
    }

    private List<Data> _myDataList;
    public List<Data> MyDataList { 
        get { return _myDataList; }
        set
            {
                _myDataList = value;
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs("MyDataList"));
            }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Этот класс содержит логику для создания вашего списка данных, к этому также могут быть добавлены дополнительные дополнения к вашему представлению.INotifyPropertyChanged гарантирует, что экран синхронизируется с данными, которые вы вводите в код.

Это позволяет вам просто создать модель представления и поместить ее как текстовый текст вашего представления.

private MyViewModel _viewModel;
public VehicleInOutWnd()
{
    InitializeComponent();
    _viewModel = new MyViewModel();
    this.DataContext = _viewModel;

    public void ClickButton() 
    {
        // You could just access _viewModel.MyDataList for an up-to-date list.
    }
}

XAML изменится на следующее для размещения нового текста данных.

<DataGrid Name="InstrumentGrid"
                      ItemsSource={Binding MyDataList}
                      VerticalAlignment="Top" HorizontalAlignment="left" 
                      Margin="0,16,0,0" Grid.ColumnSpan="3" Grid.Row="19" Grid.RowSpan="2" 
                      AutoGenerateColumns="False"
                      Width="422" Grid.Column="1">
0 голосов
/ 28 декабря 2018

Если все свойства вашего класса данных относятся к типу значений, создайте новый список

var originalList = InstrumentGrid.ItemsSource as List<Data>;
var anotherList= new List<Data>(originalList);

Но если в вашем классе данных есть члены с типом ссылки, вы должны добавить в свой класс метод конструктора копирования, который будет инициализировать данные.и тогда вы можете клонировать свой список, как это

originalList.ForEach((item)=>
    {
        anotherList.Add(new Data(item));
    });
0 голосов
/ 28 декабря 2018

Вы можете попробовать получить DataContext из сетки.

Допустим, вам нужен этот список при нажатии кнопки, вы можете написать обработчик нажатия кнопки в xaml.cs, тогда код будет выглядеть примерно так:

var list = (List<Data>)InstrumentGrid.DataSource;
viewModel.ProcessListofData(list);
...