我有一个filterexpression,可以让您从gridview过滤结果。
我有两个下拉列表(filterexpression中有5个和6个,其余的是文本框并且工作正常),您可以在其中选择特定的预定义范围来过滤结果。
我的filterexpression如下:
FilterExpression="CompanyName LIKE '{0}%' AND CityName like '{1}%' AND Convert(Zipcode, 'System.String') like '{2}%' AND Convert(ActionID, 'System.String') like '{4}%' AND Convert(Employees, 'System.String') like '{5}%' or (Convert(Zipcode, 'System.String') >= '{2}%' AND Convert(Zipcode, 'System.String') <= '{3}%') or (Convert(Employees, 'System.String') >= '{5}%' AND Convert(Employees, 'System.String') <= '{6}%')">
我的问题是员工人数。在我有99,199,499,999和1000的员工人数的可用值中。
如果我选择第一个值为99而第二个值为199,我也会得到拥有999名员工的公司的结果,因为它包含99个。但是这在逻辑上不应该发生,因为999是选定的范围。
知道如何解决这个问题吗?
编辑:忘记提及,我的控制参数中有ConvertEmptyStringToNull = false。所以我不必填写每个文本框来获得结果。
关于转换,这是我必须要做的事情,否则它不会在gridview中显示任何数据,除非我指定过滤器。
答案 0 :(得分:3)
如果您添加一些换行符,您会看到正在发生的事情
CompanyName LIKE '{0}%'
AND CityName like '{1}%'
AND Convert(Zipcode, 'System.String') like '{2}%'
AND Convert(ActionID, 'System.String') like '{4}%'
AND Convert(Employees, 'System.String') like '{5}%'
or
(
Convert(Zipcode, 'System.String') >= '{2}%'
AND Convert(Zipcode, 'System.String') <= '{3}%'
)
or
(
Convert(Employees, 'System.String') >= '{5}%'
AND Convert(Employees, 'System.String') <= '{6}%'
)
基本上,如果您的第一个块(具有四个AND)匹配,则会显示一条记录,即使所有OR块都不匹配。
仔细看AND Convert(Employees, 'System.String') like '{5}%'
,这意味着
AND Employees LIKE '99%'
对于999也是如此。我建议您从第一个块中删除Emplyee过滤器。
<强>更新强>
还有另一个问题,在您的OR表达式中,您使用带有字符串的>=
和<=
运算符。我无法预测该如何评估,但我建议您将Employees转换为int并删除最后的%
。
or
(
Convert(Employees, 'System.Int32') >= {5}
AND Convert(Employees, 'System.Int32') <= {6}
)