XtraGrid AutoFilterRow自定义范围过滤

时间:2014-05-30 16:31:23

标签: devexpress criteria xtragrid autofilter devexpress-windows-ui

我正在尝试改进其中一个列的AutoFilterRow功能。该列将始终由一个字符串组成,该字符串表示一系列值,如下所示:"num1 - num2"。我想允许最终用户在AutoFilterRow和此特定列中的单元格中键入值,以及其部分的范围包含他们键入的数字的行。例如,如果我有3行,并且每个部分属性都是以下内容:"1 - 4""1 - 6""4 - 6",并且用户在{{{}}中输入"3" 1}}此列的单元格,我希望包含AutoFilterRow"1 - 4"的行。

我已经覆盖了"1 - 6"中的CreateAutoFilterCriterion以允许其他运营商,如本网站上的几个示例所示:

MyGridView

我该怎么做呢?我想我想通过调用protected override CriteriaOperator CreateAutoFilterCriterion(GridColumn column, AutoFilterCondition condition, object _value, string strVal) { if ((column.ColumnType == typeof(double) || column.ColumnType == typeof(float) || column.ColumnType == typeof(int)) && strVal.Length > 0) { BinaryOperatorType type = BinaryOperatorType.Equal; string operand = string.Empty; if (strVal.Length > 1) { operand = strVal.Substring(0, 2); if (operand.Equals(">=")) type = BinaryOperatorType.GreaterOrEqual; else if (operand.Equals("<=")) type = BinaryOperatorType.LessOrEqual; else if (operand.Equals("<>")) type = BinaryOperatorType.NotEqual; } if (type == BinaryOperatorType.Equal) { operand = strVal.Substring(0, 1); if (operand.Equals(">")) type = BinaryOperatorType.Greater; else if (operand.Equals("<")) type = BinaryOperatorType.Less; else if (operand.Equals("!") || operand.Equals("~")) type = BinaryOperatorType.NotEqual; } if (type != BinaryOperatorType.Equal) { string val = strVal.Replace(operand, string.Empty); try { if (!val.IsEmpty()) { if (column.ColumnType == typeof(double)) { var num = Double.Parse(val, NumberStyles.Number, column.RealColumnEdit.EditFormat.Format); return new BinaryOperator(column.FieldName, num, type); } if (column.ColumnType == typeof(float)) { var num = float.Parse(val, NumberStyles.Number, column.RealColumnEdit.EditFormat.Format); return new BinaryOperator(column.FieldName, num, type); } else { var num = int.Parse(val, NumberStyles.Number, column.RealColumnEdit.EditFormat.Format); return new BinaryOperator(column.FieldName, num, type); } } // DateTime example: // DateTime dt = DateTime.ParseExact(val, "d", column.RealColumnEdit.EditFormat.Format); // return new BinaryOperator(column.FieldName, dt, type); } catch { return null; } } } // // HERE IS WHERE I WANT TO ADD THE FUNCTIONALITY I'M SPEAKING OF // else if (column.FieldName == "SectionDisplayUnits") { try { if (!strVal.IsEmpty()) { } } catch { return null; } } return base.CreateAutoFilterCriterion(column, condition, _value, strVal); } 来分割每个字符串,如下所示:Split(...)。然后我将从调用cellString.Split(' - ')返回的每个字符串解析成一个数字,以便我可以使用不等运算符。但我不知道该如何去做。我可以得到一些帮助吗?谢谢!

更新

请与我本人以及知识渊博的DevExpress代表一起在这里查看有关此事的更深入的讨论。我得到了很多帮助,我想与需要类似帮助的人分享这些知识。 Here is the link.

1 个答案:

答案 0 :(得分:1)

使用C#,您可以将值拆分为两部分,将它们转换为数字,并将用户输入的值与两个值进行比较,以确保它大于或等于第一部分,小于或等于第二部分

Criteria Language中,可以使用Function Operators创建相同的功能。但是,表达式会有点复杂。请尝试以下方法。仅当SectionDisplayUnits列中的值的格式是固定的,并且值始终由&#34; - &#34;分隔的两个数字组成时,它才有效。

string rangeDelimiter = "-";
return CriteriaOperator.Parse("toint(trim(substring(SectionDisplayUnits, 0, charindex(?, SectionDisplayUnits)))) <= ? && toint(trim(substring(SectionDisplayUnits, charindex(?, SectionDisplayUnits) + 1, len(SectionDisplayUnits) - charIndex(?, SectionDisplayUnits) - 1))) >= ?", rangeDelimiter, _value, rangeDelimiter, rangeDelimiter, _value);