【问题标题】:'DeferRefresh' is not allowed during an AddNew or EditItem transaction在 AddNew 或 EditItem 事务期间不允许“DeferRefresh”
【发布时间】:2013-08-19 08:24:04
【问题描述】:

我在 GUI 中有一个选项卡控件,其中一个选项卡中有 WPF 4.0 数据网格。当我单击网格中的单元格并编辑某些内容然后切换选项卡时,出现延迟刷新错误:

在 AddNew 或 EditItem 事务期间不允许 DeferRefresh'。

因此,当切换选项卡以取消任何待处理的编辑并且延迟刷新问题消失时,我致电 datagrid.CancelEdit(DataGridEditingUnit.Row)

但我真正想做的是CommitEdit(),这样用户就不必再次重新输入数据了。

datagrid.CommitEdit(DataGridEditingUnit.Row, true) 不适合我。 我在CommitEnd() 上收到以下错误:

在调度程序处理期间无法执行此操作 暂停。

PS:我试过 datagrid.CommitEdit() 和 datagrid.CommitEdit(DataGridEditingUnit.Column, true) 都没有用。

【问题讨论】:

  • 你能显示数据网格和事件的代码吗?
  • 在远程桌面上工作并且编辑期间连接关闭时出现相同的错误(可能只是在 PC 进入睡眠状态时发生,而 RDP 是一个红鲱鱼)。通过执行相同的 CommitEdit() 调用以响应 SystemEvents.PowerModeChanged 进行修复。确保将此静态事件与 WeakEventManager 一起使用,这样您就不会泄漏网格和/或在 Unloaded 中注销。

标签: wpf wpfdatagrid


【解决方案1】:

在 Xaml 中:

Loaded="OnUserControlLoaded"

Unloaded="OnUserControlUnloaded"

OnUserControlLoadedOnUserControlUnloaded 方法的代码后面:

dataGrid.CommitEdit()

dataGrid.CancelEdit()

【讨论】:

    【解决方案2】:

    我通过为 DataGrid 的 Unloaded 事件添加此处理程序解决了这个问题:

        void DataGrid_Unloaded(object sender, RoutedEventArgs e)
        {
            var grid = (DataGrid)sender;
            grid.CommitEdit(DataGridEditingUnit.Row, true);
        }
    

    【讨论】:

    • 这似乎有效。我在做 grid.CommitEdit() 并且没有工作。我想知道为什么这些参数是必要的。谢谢!
    【解决方案3】:

    我已经通过添加这段代码解决了这个问题:

    private void tabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (tabControl.SelectedIndex == 1)
            {                               
                 WPFdataGrid.CancelEdit(DataGridEditingUnit.Row);                                
            }
        }
    

    我认为这是 UI 线程的问题。

    【讨论】:

      【解决方案4】:

      我刚刚通过“提交”更改作为我的数据源的 DataTable 解决了一个类似的问题。

      因此,如果您在源代码中有一个 DataTable,您可以尝试以下代码:

      DataTableSource.AcceptChanges();
      

      【讨论】:

        【解决方案5】:

        我以前遇到过这种情况。 WPF 仅将当前选项卡的视图保留在内存中;当您切换选项卡时,WPF 会卸载当前视图并加载所选选项卡的视图。但是,如果当前正在执行 AddNew 或 EditItem 事务并且 WPF 尝试卸载它,则 DataGrid 会引发此异常。

        我的解决方案是将所有选项卡视图保留在内存中,但仅将当前选项卡的视图设置为可见。此链接显示了执行此操作的方法:

        WPF TabControl - Preventing Unload on Tab Change?

        此更改还将使您的选项卡在您切换它们时更顺畅地加载,因为不必重新生成视图。就我而言,额外的内存使用是一个合理的权衡。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-12
          • 2013-11-30
          相关资源
          最近更新 更多