当我过滤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'
到目前为止,我已经尝试了以下方法来解决这个问题:
在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);
}
}
}
从数据库中解析过滤器表达式
var parsedExpression = CriteriaOperator.Parse(filter.FilterExpression); string criteria = DevExpress.Data.Filtering.CriteriaOperator.LegacyToString(parsedExpression); this.grid.FilterExpression = criteria;
目前我无法弄清楚为什么会出现这种情况,因此对此问题的任何建议都非常有用。
答案 0 :(得分:1)
[ColumnName]&gt; &#39; 20&#39;并且[ColumnName]&lt; &#39; 50&#39; - 此表达式比较字符串值,而不是数字。要比较数字,应使用以下表达式: [ColumnName]&gt; 20和[ColumnName]&lt; 50
语法在在线文档中有所描述:Criteria Language Syntax
此外,列值应该是合适的类型。如果值是字符串类型,则格式化无关紧要。它们将被比作字符串。换句话说 - 按字母顺序排列。