首页 > 解决方案 > WPF,处理来自数据网格的数据,独立于数据网格

问题描述

我需要从数据网格中获取数据并独立于数据网格处理这些数据。

我在 XAML 中写道:

<Window x:Class="DatagridExample1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:DatagridExample1"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Height="26" Margin="10,0,0,0" VerticalAlignment="Top" Width="774" Click="button_Click"/>
    <DataGrid x:Name="dg" HorizontalAlignment="Left" Height="379" Margin="10,31,0,0" VerticalAlignment="Top" Width="774" SelectionChanged="dg_SelectionChanged"  AutoGenerateColumns="False" SelectionUnit="CellOrRowHeader" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Reference" Binding="{Binding Reference}" IsReadOnly="True"/>
            <DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*"/>
            <DataGridTextColumn Header="PartName" Binding="{Binding PartName}" Width="*"/>
         </DataGrid.Columns>
    </DataGrid>         

</Grid>

书面课堂部分如下:

public class Part
{
    public Part()
    {
    }

    public string Reference { get; set; }
    public string Value { get; set; }
    public string PartName { get; set; }
}

之后,我用 Part 对象编写了一个集合,填充这些集合并将其推送到数据网格中。

    public  List<Part> list;
    public MainWindow()
    {
        Part p1 = new Part() { Reference = "R1", Value = "10R", PartName = "10R 0402" };

        Part p2 = new Part() { Reference = "R2", Value = "10R", PartName = "10R 0402" };
        Part p3 = new Part() { Reference = "R3", Value = "10R", PartName = "10R 0402" };
        list = new List<Part>(){};
        list.Add(p1);
        list.Add(p2);
        list.Add(p3);
        list.Add(p1);

        InitializeComponent();

        dg.ItemsSource = list;        

    }

这部分没问题。运行程序后,我可以看到我的表格:(请参阅链接中的图片) 主窗口:正确的表格

之后,我单击按钮并运行此代码:

    private void button_Click(object sender, RoutedEventArgs e)
    {
        List<Part> oldList = (dg.ItemsSource as List<Part>);
        Part[] p = oldList.ToArray();

        p[0].Reference += p[1].Reference;


    }

看起来,好吧。我只使用数组“ p ”,我没有使用“ dg ”但是当我对表中的列进行排序时。我真的很困惑,因为“ dg ”中的数据发生了变化。如何和为什么?我怎样才能解决这个问题。因为我需要使用独立于数据网格的数组。

当我没有使用数据网格时,为什么 dg 中的数据发生了变化?

标签: c#wpfwpfdatagrid

解决方案


发生这种情况是因为您正在更改对象本身。

创建一个新的并不重要,List因为它是内存中相同引用的列表。一旦您更改任何值,它就会反映在显示这些对象的网格中。

如果您想“玩”这些对象而不改变反映网格的对象,则需要新对象。您需要将它们复制到不同的参考。

检查这个:在 C# 中创建对象的副本


推荐阅读