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

时间:2015-10-01 06:26:43

标签: c# winforms devexpress errorprovider

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

1 个答案:

答案 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事件。