在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH

时间:2021-11-01 17:26:01

原文 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH

在项目中关于DataGrid的遇到过一些问题,其中是关于迁入CheckBox的双向绑定后,快速点击多次后出现“AddNew或EditItem事务过程不允许DeferRefresh”的问题,如图所示

在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH或者是英文

在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH

原因是DataGrid编辑状态引起的,详情见http://*.com/questions/3354916/what-is-the-proper-way-to-handle-multiple-datagrids-in-a-tab-control-so-that-cel

解决方法正如上面所说的,在datagrid中添加一个PreviewMouseDown鼠标按下前事件,如下

在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH
        /// <summary>
/// 鼠标按下事件,处理快速点击发生deferRefresh异常的处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dtgSchemeApp_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (IsUnderTabHeader(e.OriginalSource as DependencyObject))
CommitTables(this.dtgSchemeApp);
} private bool IsUnderTabHeader(DependencyObject control)
{
if (control is TabItem)
return true;
DependencyObject parent = VisualTreeHelper.GetParent(control);
if (parent == null)
return false;
return IsUnderTabHeader(parent);
} private void CommitTables(DependencyObject control)
{
if (control is DataGrid)
{
DataGrid grid = control as DataGrid;
grid.CommitEdit(DataGridEditingUnit.Row, true);
return;
}
int childrenCount = VisualTreeHelper.GetChildrenCount(control);
for (int childIndex = 0; childIndex < childrenCount; childIndex++)
CommitTables(VisualTreeHelper.GetChild(control, childIndex));
}

在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH

其中this.dtgSchemeApp是DataGrid的名称,大家可以了解一下。