当宽度改变时,DxErrorProvider在消息框中显示错误信息

本文关键字:消息 显示 信息 错误 DxErrorProvider 改变 | 更新日期: 2023-09-27 18:15:39

我正在使用DxErrorProvider类进行数据验证。使用ValidatingEditor事件在GridControl的单元格中验证数据。它的工作很好,但其中一列是非常紧的,所以当我想显示在列的单元格错误我尝试改变宽度。这些操作使得DxErrorProvider(可能)在消息框中显示错误,而不是在单元格中显示带有'x'的漂亮圆圈。

下面你可以看到我实现的事件处理程序。

private void ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e)
{
    GridView view = sender as GridView;
    if (view.FocusedColumn.FieldName == "COLUMN1")
    {
        if (e.Value is bool)
        {
            GridColumn column = view.GetDataSourceItem<MyClass>(view.FocusedRowHandle);
            if (Names.Any(x => x.FieldName == column.FieldName) && !((bool)e.Value))
            {
                // These 2 lines make errorprovider go crazy
                //view.FocusedColumn.MaxWidth += 50;
                //view.FocusedColumn.Width += 30;
                e.Valid = false;
                e.ErrorText = "The error";
            }
            else
            {
                e.Valid = true;
                //view.FocusedColumn.Width -= 30;
                //view.FocusedColumn.MaxWidth -= 50;
            }
        }
        else
        {
            e.Valid = false;
            e.ErrorText = "Invalid value";
        }
    }
}

如何保持DxErrorProvider的默认行为((x))和改变列的宽度

当宽度改变时,DxErrorProvider在消息框中显示错误信息

DxErrorProvider无关。以下步骤描述了问题的原因:

0。当您要编辑单元格时,将在单元格的位置创建编辑器对象。该编辑器基于BaseEdit类后代,称为就地编辑器。您可以通过ColumnView.ActiveEditor属性获得此编辑器。
1. 当您验证单元格时,就地编辑器实际上是经过验证的,并且这个带有'x'的漂亮圆圈显示在编辑器中而不是单元格中。
2. 但是当您更改列的宽度时,编辑器将关闭,因此没有地方显示圆圈,这导致显示消息框。

因此,简单的解决方法是在更改列的宽度后显示编辑器。您可以使用GridView.ShowEditor方法。您还需要将验证值放入这个编辑器中。
下面是示例:
private void ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e)
{
    GridView view = sender as GridView;
    if (view.FocusedColumn.FieldName == "COLUMN1")
    {
        if (e.Value is bool)
        {
            GridColumn column = view.GetDataSourceItem<MyClass>(view.FocusedRowHandle);
            if (Names.Any(x => x.FieldName == column.FieldName) && !((bool)e.Value))
            {
                // These 2 lines make errorprovider go crazy
                view.FocusedColumn.MaxWidth += 50;
                view.FocusedColumn.Width += 30;
                view.ShowEditor();
                view.ActiveEditor.EditValue = e.Value;
                e.Valid = false;
                e.ErrorText = "The error";
            }
            else
            {
                e.Valid = true;
                view.FocusedColumn.Width -= 30;
                view.FocusedColumn.MaxWidth -= 50;
            }
        }
        else
        {
            e.Valid = false;
            e.ErrorText = "Invalid value";
        }
    }
}

注::也可以考虑使用ColumnView.ValidateRow事件。