绑定到GridView的C#WPF数据表(更准确地说是Telerik的RadGridView)

绑定到GridView的C#WPF数据表(更准确地说是Telerik的RadGridView),c#,wpf,gridview,datatable,telerik,C#,Wpf,Gridview,Datatable,Telerik,我有个小问题。我有一个定期更改的MySQL表模式(即列及其类型)。由于这个需求,我将ORM编程为以数据表的形式存储它,而不是固定的可序列化类型 我现在有兴趣在窗口中显示这张桌子。准确地说,它将绑定到GridView对象(Telerik库中的RadGridView类型)。我使用以下代码绑定了该表: DataTable dt = GetMyTable(); radGridView.ItemsSource = dt.DefaultView; 这很好。但是,如果我要用以下代码更新此表,那么这个过程将极

我有个小问题。我有一个定期更改的MySQL表模式(即列及其类型)。由于这个需求,我将ORM编程为以数据表的形式存储它,而不是固定的可序列化类型

我现在有兴趣在窗口中显示这张桌子。准确地说,它将绑定到GridView对象(Telerik库中的RadGridView类型)。我使用以下代码绑定了该表:

DataTable dt = GetMyTable();
radGridView.ItemsSource = dt.DefaultView;
这很好。但是,如果我要用以下代码更新此表,那么这个过程将极其缓慢:

dt.BeginLoadData();
for (object[] new_row in new_rows) {
    dt.Rows.Add(new_row);
}
dt.EndLoadData();
dt.AcceptChanges();
我知道DataTable在更新时会转储大量事件,但至少在理论上,它们应该通过BeginLoadData()调用关闭

我还尝试使用一个名为BindingSource的适配器,并在本文中记录了一些步骤

这确实加快了速度,但仍然不够有效

我的目标是用我的DataTable进行批量加载,每当从线程向其中添加一批新行时,GridView也会更新以显示新行。显然,我希望尽可能高效地完成这项工作

有什么意见吗


谢谢。

代码是在UI线程上运行还是在工作线程上运行?BeginLoadData/EndLoadData模式的要点是在从另一个线程更新数据时将UI线程与IEnumerable解耦(这通常会导致异常),从而保持UI线程自由更新UI.PS。您所说的高效是什么意思?如果您是说响应速度更快,通常从CPU的角度来看,这会降低代码的效率。如果您是说使用更少的时间进行UI更新,恐怕这可能是在没有虚拟行的情况下所能达到的最快速度。批量加载是在worker t上完成的我希望进程既快又不冻结GUI。如果解决了问题,我完全支持UI虚拟化。这应该会有帮助。UI“冻结”的可能原因是因为RadGridView正忙于为每个新元素创建RadGridViewRowInfo。因为它们是UI元素,所以需要在UI线程上完成。UI虚拟化将推迟GridViewRowInfo的创建,直到用户实际向下滚动到新行。当然,如果您枚举GridViewRowInfo,则不会得到每一行对于每一个数据元素,我能读到什么指南吗?非洲,Telerik的网格已经默认开启了虚拟化设置。