在列表中获取Wpf DataGrid数据

时间:2018-12-28 11:47:36

标签: c# wpf wpfdatagrid

我有一个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 :(得分:1)

我假设您需要更改后的数据网格中的数据。如果将初始列表列表(此处的命名令人困惑)绑定到数据网格,则将始终对其进行更新而无需人工干预。

最干净的解决方案是使用视图模型。

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">

答案 1 :(得分:1)

如果您的数据类的所有属性均为值类型,请创建新的列表

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

但是,如果您的数据类具有Refreence类型的成员,则应该 在您的类中添加一个copy-constructor方法,该方法将初始化Data并 那么您可以像这样克隆您的列表

originalList.ForEach((item)=>
    {
        anotherList.Add(new Data(item));
    });

答案 2 :(得分:1)

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.

答案 3 :(得分:0)

您可以尝试获取网格的DataContext。

假设您希望单击按钮时获得该列表,可以在xaml.cs中编写按钮单击处理程序,那么代码将类似于:

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