将DataView加载到DataGrid会导致ShowDialog挂起?

时间:2013-04-05 05:53:50

标签: c# wpf wpfdatagrid

我有这个非常简单的代码:

var xlData = Excel8OleDbHelper.ImportExcelFile(fileName);
var viewModel = new MyViewModel(xlData);

_window = new MyWindow(viewModel);
_window.ShowDialog();

Excel8OleDbHelper.ImportExcelFile()方法有效,我可以在调试时查看DataTable的内容。问题是_window根本没有出现,并且线程的行为就像它一样(即它正在等待未示出的窗口被关闭)。

如果我更改了此代码:

var viewModel = new MyViewModel(new DataTable());

_window = new MyWindow(viewModel);
_window.ShowDialog();

然后出现窗口,但当然是空格。

网格的XAML:

<DataGrid x:Name="MyGrid" Margin="4" 
    IsReadOnly="True" SelectionUnit="Cell" 
    ItemsSource="{Binding Path=GridSource}" />

ViewModel的构造函数:

public DataView GridSource { get; private set; }
public MyViewModel(DataTable dataSource)
{
    GridSource = dataSource.DefaultView;
}

这是我第一次使用WPF数据网格,所以也许我在这里做错了,但我真的不知道网格有什么问题会阻止窗口出现,而不是给我一个异常并实际冻结我的应用程序。

任何线索?如果有任何遗漏,我很乐意提供更多代码!

更新 加载116行x 47列的Excel工作簿;我需要加载的文件有5,000多行x 47列 - 对于较大的数据集,WPF DataGrid 是否需要分页? WinForms DataGridView没有问题,而且速度更快,我认为它的WPF版本会以类似的方式工作。所以问题是ShowDialog正在等待数据网格加载数据。我认为它是挂起的,因为我不希望WPF DataGrid花费一分钟来完成WinForms DataGridView立即执行的操作。

2 个答案:

答案 0 :(得分:1)

现在我们已经确定了数据量的问题:

  • 您是否启用了行和列虚拟化?您可以在datagrid
  • 上设置EnableRowVirtualization = true
  • 您使用的是自动调整大小的列吗?为每个新行/列重新计算最佳大小可以是一个性能拖累 - 尝试使用固定列大小或比例(1 *)大小。您可以尝试使用Height for Rows的类似方法。

答案 1 :(得分:0)

尝试这样做。我不确定这是否有效。我认为在main中加载Excel会导致问题或死锁。

var xlData = Excel8OleDbHelper.ImportExcelFile(fileName);
var viewModel = new MyViewModel(fileName);
_window = new MyWindow(viewModel);
_window.ShowDialog();

public class MyViewModel
{
    public MyViewModel(string filename)
    {
        filename = filename;
    }

    private string _filename;

    private DataTable _xlData;
    public DataTable XlData
    {
        return _xlData ?? (_xlData = Excel8OleDbHelper.ImportExcelFile(fileName);
    }
}