2011-11-17 44 views
0

我有一个非常大的XML文件,4677 KB - 基本围绕26000行,每行看起来像:尝试加载一个很长的名单WPF的DataGrid

<samples> 
<sample id=1 field =test field1=test1 field2=test2 field3=""test3"" field4=""test4"" field5=""test5"" field6=""test6"" field7=""test7"" field8=""test8"" field9=""test9"" field10=""test10"" /> 
<sample id=""2"" field =""test"" field1=""test1"" field2=""test2"" field3=""test3"" field4=""test4"" field5=""test5"" field6=""test6"" field7=""test7"" field8=""test8"" field9=""test9"" field10=""test10"" /> 
<sample id=""3"" field =""test"" field1=""test1"" field2=""test2"" field3=""test3"" field4=""test4"" field5=""test5"" field6=""test6"" field7=""test7"" field8=""test8"" field9=""test9"" field10=""test10"" /> 

...

和我试图使用DataSet/DataView将其加载到WPF DataGrid中。果然,OutOfMemoryException异常试图绑定到本作,所以当被解雇:

 <Grid x:Name="LayoutRoot"> 
     <HeaderedContentControl Header="Sample Data"> 
     <DataGrid 
       x:Name="DataGrid" 
       AutoGenerateColumns="True" 
       ItemsSource="{Binding Path=GridData, Mode=OneWay}"> 
      </DataGrid> 
     </HeaderedContentControl> 
    </Grid> 

我尝试添加了VirtualizingStackPanel.IsVirtualizing =“真”(虽然这是默认设置),也VirtualizingStackPanel.VirtualizationMode =“回收”,但它没有帮助。

我知道这是控制数据吨,我想知道我的选择是什么。

+0

尝试使用XML流而不是普通的XML加载。流式传输可能会帮助你摆脱内存异常 –

回答

0

我不认为4,7Megs的数据会给你一个内存不足的例外。此外,正如您已经写过的,DataGrid工作在虚拟化模式。在设置ItensSource之后你会得到异常吗?
尝试加载数据而不将其附加到DataGrid。然后你知道问题是否是加载代码。我会检查加载代码的无限循环。

+0

我也不这么认为。在将ItemsSource绑定到dataset.Tables [0] .DefaultView之后,我得到异常 - 但经过很长时间的等待。 XDocument.Load快速返回,dataset.ReadXml返回速度相当快,但是当控件尝试渲染时,会有7-10分钟的等待,没有任何反应,然后异常提升。 – user350213

+0

任何想法如何进一步排除故障? – user350213

+0

@ user350213:如果我使用DataGrid,我总是为每个项目创建一个ViewModel(每个行项目的包装)。我从来没有遇到过这个问题。还有一件事:你有没有激活分组?如果是的话,这将是问题,因为分组消除了虚拟化项目的可能性。 – HCL

0

我同意HCL,这似乎并没有与这些控件的呈现相关。我的建议是让你有一个单独的数据结构绑定到视图的视图模型。然后从你的xml文件中加载数据结构。通过这种方式,您可以分离任务,并缩小问题范围。当然,绑定件不是罪魁祸首。

+0

谢谢古斯塔沃。其实我确实在MVVM结构中有GridData,它是返回DataView的MainWindowViewModel的属性。我直接在视图中消除疑虑。它的确如此,我没有具体的数据结构 - 我有点让DataSet为我组织它 – user350213

+0

我会为结构创建自己的列表,并通过循环遍历xml而不是使用DataSet来填充它们。至少在问题被发现之前。 –

1

尝试设置的DataGrid宽度高度修正值。这就是解决我们这个问题的方法。

<Grid x:Name="LayoutRoot"> 
    <HeaderedContentControl Header="Sample Data"> 
     <DataGrid 
      x:Name="DataGrid" 
      Width="600" Height="400" 
      AutoGenerateColumns="True" 
      ItemsSource="{Binding Path=GridData, Mode=OneWay}"> 
     </DataGrid> 
    </HeaderedContentControl> 
</Grid>