我正在使用DxErrorProvider类进行数据验证。借助ValidatingEditor事件在GridControl的单元格中验证数据。它工作正常,但其中一列很紧,所以当我想在该列的单元格中显示错误时,我会尝试更改宽度。这些操作使得DxErrorProvider(可能)在消息框中显示错误,而不是使用' x'在细胞中。
下面你可以看到我对事件处理程序的实现。
Array (
[USER] => ************
[FCGI_ROLE] => RESPONDER
[APP_ENGINE_VERSION] => 5.4
[APP_ENGINE] => php
[ENVIRONMENT] => production
[UNIQUE_ID] => *********************************
[GEOIP_COUNTRY_CODE] => FR
[GEOIP_COUNTRY_NAME] => France
[GEOIP_REGION] => B8
[GEOIP_CITY] => Biot
[GEOIP_DMA_CODE] => 0
[GEOIP_AREA_CODE] => 0
[GEOIP_LATITUDE] => ******************
[GEOIP_LONGITUDE] => ********************
[SCRIPT_URL] => /user/whyj/3/
[SCRIPT_URI] => http://SITENAME.tv/user/whyj/3/
[CFG_CLUSTER] => ************
[HTTP_REMOTE_IP] => *****************
[HTTP_HOST] => SITENAME.tv
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_REFERER] => http://SITENAME.tv/fr/
[HTTP_COOKIE] => ******************************************************
[HTTP_CONNECTION] => keep-alive
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache
[SERVER_NAME] => SITENAME.tv
[SERVER_ADDR] => ***************
[SERVER_PORT] => 80
[REMOTE_ADDR] => *****************
[DOCUMENT_ROOT] => /home/************/www/SITENAME
[SERVER_ADMIN] => postmaster@SITENAME.tv
[SCRIPT_FILENAME] => /home/************/www/SITENAME/user.php
[REMOTE_PORT] => 63334
[REMOTE_USER] => coucou
[AUTH_TYPE] => Basic
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /user/whyj/3/
[SCRIPT_NAME] => /user.php
[PATH_INFO] => /whyj/3/
[PATH_TRANSLATED] => /homez.38/************/www/SITENAME/whyj/3/
[PHP_SELF] => /user.php/whyj/3/
[REQUEST_TIME_FLOAT] => 1443773143.8235
[REQUEST_TIME] => 1443773143
[argv] => Array ( )
[argc] => 0 )
如何保留DxErrorProvider((x))的默认行为并更改列的宽度。
答案 0 :(得分:2)
与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
事件。