【发布时间】:2012-06-23 11:03:19
【问题描述】:
我有一个用 DataView 填充的 DataGrid(使用 DataContext)。我试图在一个单独的线程中执行此操作,但 UI 仍然冻结。我想防止 UI 在填充 DataGrid 时冻结。
这是我目前制作的代码:
private void btnOK_Click(object sender, RoutedEventArgs e)
{
GetFieldsBLL getFieldsBLL = new GetFieldsBLL();
DataView dv = getFieldsBLL.GetWholeView(ViewName);
Task task = new Task(() => ucDataExtracViewControl.PopulateGrid(dv));
task.Start();
}
public void PopulateGrid(DataView dv)
{
dgView.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate{
dgView.Columns.Clear();
dgView.AutoGenerateColumns = false;
foreach (DataColumn column in dv.Table.Columns)
{
var gridColumn = new DataGridTextColumn()
{
Header = column.ColumnName,
Binding = new Binding("[" + column.ColumnName + "]")
};
dgView.Columns.Add(gridColumn);
}
dgView.DataContext = dv;
DataView = dv;
}));
}
提前致谢!
编辑: 我重新创建列的原因是因为某些列名的名称中有一个点。例如“工作编号”。使用绑定时不会产生任何数据。在此处阅读更多信息:What is it about DataTable Column Names with dots that makes them unsuitable for WPF's DataGrid control? 不能对数据库进行更改。 ——
【问题讨论】:
-
主 UI 线程创建 UI 对象并且是唯一可以访问 UI 对象的线程。您可以在背景踏板上使用 GetFieldsBLL()。如果您不需要编辑,请使用 ListView GridView,因为它更轻、更快。
-
将答案标记为已接受通常是有礼貌的。否则人们下次不会再帮你了。
标签: c# wpf multithreading