DxErrorProvider 在宽度变化时在消息框中显示错误信息
DxErrorProvider displays error message in messagebox when width changes
我正在使用 DxErrorProvider class 进行数据验证。在 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 (the ( x)) 的默认行为并更改列的宽度。
与DxErrorProvider
无关。以下步骤描述了问题的原因:
0。当您要编辑单元格时,会创建编辑器对象来代替单元格。此编辑器基于 BaseEdit
class descendant and called in-place editor. You can get this editor through 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
事件代替。
我正在使用 DxErrorProvider class 进行数据验证。在 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 (the ( x)) 的默认行为并更改列的宽度。
与DxErrorProvider
无关。以下步骤描述了问题的原因:
0。当您要编辑单元格时,会创建编辑器对象来代替单元格。此编辑器基于 BaseEdit
class descendant and called in-place editor. You can get this editor through 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
事件代替。