我正在尝试改进其中一个列的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.
答案 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);