ASPxGridView FilterExpression无法正确过滤十进制值

时间:2014-12-03 08:27:46

标签: datagridview webforms devexpress

当我过滤ASPxGridView十进制列时,过滤表达式未正确解释。例如,我使用过滤器[Value]>20,但显示大于3.00的所有值。当我们通过grid.FilterExpression设置过滤条件时,会发生此行为。如果我们在ColumnAutoFilter中设置相同的过滤表达式,则正确解释十进制值。

girdView的aspx代码如下:

<dx:ASPxGridView SettingsBehavior-AutoFilterRowInputDelay="60000" ID="grid" KeyFieldName="Id" 
     AccessKey="G" SkinID="AspxGridView" runat="server" AutoGenerateColumns="False" ClientIDMode="AutoID" 
     OnCustomColumnDisplayText="grid_CustomColumnDisplayText" 
     OnHtmlRowCreated="grid_HtmlRowCreated" 
     OnHtmlDataCellPrepared="grid_HtmlDataCellPrepared" 
     EnableViewState="false" EnableRowsCache="false" meta:resourcekey="gridResource1" Width="100%">
     <Columns>
         <dx:GridViewDataColumn Caption="Column1" FieldName="<%$ Column1Name %>" ShowInCustomizationForm="True" Visible="False" meta:resourcekey="GridViewDataColumnResource11">
             <Settings FilterMode="Value" />
             <CellStyle HorizontalAlign="Right" />
         </dx:GridViewDataColumn>
     </Columns>
     <Settings ShowFilterRow="True" />
     <SettingsCustomizationWindow Enabled="True" />
</dx:ASPxGridView>

在服务器端,我们在Page_Init添加过滤表达式。

protected void Page_Init(object sender, EventArgs e)
{
    // initially we retrieve the filter from the DB
    filter = FilterMngr.GetItem(filterId, Settings.Default.MainConnStr)

    this.grid.SettingsCookies.Enabled = false;
    this.grid.FilterExpression = filter.FilterExpression;
}

然后在Page_Load我们使用值

填充网格
protected void Page_Load(object sender, EventArgs e)
{
    var gridValues = GetValuesFromDataBase();
    this.grid.DataSource = gridValues;
    grid.DataBind();
}

过滤器表达式如下: [ColumnName] > '20' And [ColumnName] < '50'

到目前为止,我已经尝试了以下方法来解决这个问题:

  1. 我确认过滤表达式使用的是FieldName而不是标题名称
  2. FieldName是有效名称
  3. 页面已本地化,因此应正确解释小数和千位分隔符
  4. 处理ColumnAutoFilter。
  5. 在Aspx页面中,我们将以下属性添加到gridView

    OnProcessColumnAutoFilter="grid_ProcessColumnAutoFilter"
    
    
    protected void gridInverters_ProcessColumnAutoFilter(object sender,
    DevExpress.Web.ASPxGridView.ASPxGridViewAutoFilterEventArgs e)
    {
        if (e.Kind == GridViewAutoFilterEventKind.CreateCriteria)
        {
            if (!String.IsNullOrEmpty(e.Value))
            {
                decimal value;
                if (decimal.TryParse(
                    e.Value, 
                    NumberStyles.Currency, 
                    CultureInfo.CurrentCulture, 
                    out value))
                    e.Criteria = new BinaryOperator(e.Column.FieldName, value);
            }
        }
    }
    
    1. 从数据库中解析过滤器表达式

      var parsedExpression = CriteriaOperator.Parse(filter.FilterExpression); string criteria = DevExpress.Data.Filtering.CriteriaOperator.LegacyToString(parsedExpression); this.grid.FilterExpression = criteria;

    2. 目前我无法弄清楚为什么会出现这种情况,因此对此问题的任何建议都非常有用。

1 个答案:

答案 0 :(得分:1)

[ColumnName]&gt; &#39; 20&#39;并且[ColumnName]&lt; &#39; 50&#39; - 此表达式比较字符串值,而不是数字。要比较数字,应使用以下表达式: [ColumnName]&gt; 20和[ColumnName]&lt; 50

语法在在线文档中有所描述:Criteria Language Syntax

此外,列值应该是合适的类型。如果值是字符串类型,则格式化无关紧要。它们将被比作字符串。换句话说 - 按字母顺序排列。