在AddNew或EditItem事务期间不允许“DeferRefresh”

问题描述 投票:15回答:5

我在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),但它没有用。

wpf wpfdatagrid
5个回答
10
投票

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

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

4
投票

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

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

WPF TabControl - Preventing Unload on Tab Change?

此更改还可以使您在标签之间切换时更加平滑,因为视图不必重新生成。在我的情况下,额外的内存使用是一个合理的权衡。


0
投票

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

因此,如果源中有DataTable,则可以尝试以下代码:

DataTableSource.AcceptChanges();

0
投票

我通过添加这段代码修复了这个问题:

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

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


0
投票

在Xaml中:

Loaded="OnUserControlLoaded"

Unloaded="OnUserControlUnloaded"

在Qazxswpoi和OnUserControlLoaded内部的代码方法:

OnUserControlUnloaded
© www.soinside.com 2019 - 2024. All rights reserved.