【问题标题】:DxErrorProvider displays error message in messagebox when width changes当宽度改变时,DxErrorProvider 在消息框中显示错误消息
【发布时间】:2015-10-01 06:26:42
【问题描述】:

我正在使用 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 ))并更改列的宽度。

【问题讨论】:

    标签: c# winforms devexpress errorprovider


    【解决方案1】:

    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";
            }
        }
    }
    

    P.S.:另外,您可以考虑使用ColumnView.ValidateRow 事件。

    【讨论】:

    • 终于有时间回到这个问题。您的示例按预期工作,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多