【问题标题】:Loading a DataView into a DataGrid causes ShowDialog to hang?将 DataView 加载到 DataGrid 会导致 ShowDialog 挂起?
【发布时间】:2013-04-05 05:53:49
【问题描述】:

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

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 立即执行的操作。

【问题讨论】:

  • 如果您完全注释掉 ItemsSource 绑定,该示例是否有效?我想不出任何答案,因为您似乎正在按照应有的方式做每一件事。
  • 你能把Excel8OleDbHelper.ImportExcelFile(fileName) 用一些低容量的固定数据存根吗?只是为了消除问题中的 Excel 部分。
  • 我认为加载 excel 在这里引起了问题。更改您的代码,提供您的视图模型文件名,并且视图模型使用 excel 帮助器。
  • @Gishu 我将尝试使用不同的较小文件,但完全相同的代码在 WinForms 下完美运行(好吧略有不同,正在实例化 form 而不是 window),将数据加载到 DataGridView 中。 @FaisalHafeez 实际上加载文件不是 ViewModel 的责任,除了 Excel 工作簿在 ShowDialog 被调用的那一刻早就关闭了......但无论如何感谢您的时间!
  • @Gishu 问题确实出在数据集的大小上;查看更新 - 我现在需要弄清楚 WPF DataGrid 分页 :)

标签: c# wpf wpfdatagrid


【解决方案1】:

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

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

【讨论】:

  • 我确实有自动调整大小的列和行 - 现在对于我正在研究的这个特殊功能,事实证明网格并不是绝对必要的,所以我用几个标签替换它来通知用户关于数据的行数和其他统计信息(蹩脚,我知道)......但为了满足我自己的好奇心(而且因为我需要其他地方的网格!),我会接受这个答案并稍微挖掘这个问题进一步,但我认为如果不实现一些分页,我就无法摆脱 5000 行......我怀疑计算行高是这种特殊情况下的瓶颈。
【解决方案2】:

尝试这样做。我不确定这是否可行。我认为在 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多