WPF,处理来自数据网格的数据,独立于数据网格
WPF, work with datafrom a datagrid, independent on datagrid
我需要从数据网格获取数据并独立于数据网格处理这些数据。
我在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>
写的Class部分如下:
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;
}
这部分还可以。在 运行 程序之后,我可以看到我的 table:(参见 link 中的图像)
Main window: correct table
之后,我点击了按钮,然后 运行 此代码:
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” 但是当我对 table 中的列进行排序时。我真的很困惑,因为“dg”中的数据发生了变化。
如何以及为什么?
我怎样才能解决这个问题。因为我需要使用独立于数据网格的数组。
Why data in dg changed, when i didnt work with datagrid?
嗯,这是因为您正在改变对象本身。
创建一个新的 List
并不重要,因为它是内存中相同引用的列表。更改任何值后,它会反映在显示这些对象的网格中。
如果您想 "play" 使用那些对象而不改变那些反映网格的对象,您需要新对象。您需要将它们复制到不同的引用。
检查这个:Creating a copy of an object in C#
我需要从数据网格获取数据并独立于数据网格处理这些数据。
我在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>
写的Class部分如下:
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;
}
这部分还可以。在 运行 程序之后,我可以看到我的 table:(参见 link 中的图像) Main window: correct table
之后,我点击了按钮,然后 运行 此代码:
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” 但是当我对 table 中的列进行排序时。我真的很困惑,因为“dg”中的数据发生了变化。 如何以及为什么? 我怎样才能解决这个问题。因为我需要使用独立于数据网格的数组。
Why data in dg changed, when i didnt work with datagrid?
嗯,这是因为您正在改变对象本身。
创建一个新的 List
并不重要,因为它是内存中相同引用的列表。更改任何值后,它会反映在显示这些对象的网格中。
如果您想 "play" 使用那些对象而不改变那些反映网格的对象,您需要新对象。您需要将它们复制到不同的引用。
检查这个:Creating a copy of an object in C#