细节
- VS-2008专业版SP1
- 版本.net 3.5
- 语言:C#
我有一个WPF数据网格,它从Linq-sql查询Datacontext数据项加载。结果集包含约200k行,加载,排序,过滤等非常缓慢。 有什么简单易行的方法来提高速度吗?
我在搜索中看到了几件事情 滚动视图,数据虚拟化等人们也谈论分页,分析等
细节
我有一个WPF数据网格,它从Linq-sql查询Datacontext数据项加载。结果集包含约200k行,加载,排序,过滤等非常缓慢。 有什么简单易行的方法来提高速度吗?
我在搜索中看到了几件事情 滚动视图,数据虚拟化等人们也谈论分页,分析等
SortMemberPath ,只因为它在每个记录上都使用反射,这将严重降低排序过程的性能。
Hosein
尽管它不能直接支持 LINQ IQueryable 对象,但您可以直接使用此示例。当然,我现在正在努力将其改进为直接与 IQueryable 对象一起使用。我觉得这并不难。http://www.codeproject.com/KB/WPF/WpfDataVirtualization.aspx
private void OnFirstTimeLoad()
{
Task.Factory.StartNew(() =>
{
foreach (var row in ViewModel.Rows)
{
/*this is all you really need,
note: since you're on the background thread, make sure IsVisible executes on the UI thread, my utils method does just that*/
myUtils.ExecuteOnUiThread(() => row.IsVisible = true);
/*optional tweak:
this just forces Ui to refresh so each row repaint staggers nicely*/
Application.Current.Dispatcher
.Invoke(DispatcherPriority.Background, (SendOrPostCallback) delegate { }, null);
}
});
}
哦,别忘了在XAML中触发:
<DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Visibility" Value="{Binding Path=IsVisible, Converter={StaticResource BoolToVisibility}}"/>
........
哇,20万行数据真的很多。分页听起来是个好主意。尝试决定每页要显示多少行,比如说50行。第一次展示屏幕时,只显示前50行。然后给用户在页面之间移动的选项。
不过这种方式可能会让排序变得更加棘手。
虚拟化可能是另一个选择,但遗憾的是,我还没有使用过虚拟化。