2014-02-26 134 views
1

我有一个filterexpression,使您能够从gridview过滤结果。filterexpression返回“错误”的结果

我有两个dropdownlists(filterexpression中的5和6,其余的是textboxes和工程ine),您可以在其中选择特定的预定义范围来筛选结果。

我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中显示任何数据,除非我指定了一个过滤器。

回答

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 Convert(Employees, 'System.String') like '{5}%'这意味着

AND Employees LIKE '99%' 

这也是真正的999,我建议你从第一块卸下Emplyee过滤器。

UPDATE

还有另外一个问题,在您的或表达你使用的是>=<=运算符与字符串。我无法预测如何评估,但我建议你将员工转换为int并在最后删除%

or 
(
    Convert(Employees, 'System.Int32') >= {5} 
    AND Convert(Employees, 'System.Int32') <= {6} 
) 
+0

但是,如果我删除,那么我应该如何筛选出一个特定的范围? – dQlle

+0

@dQlle您应该删除'AND Employees LIKE '99%''部分,它会匹配您的案例中以99开头的所有内容。另一个使用'> =和<='的parth应该已经做了你想要的(如果转换为数字)。 –

+0

我试着改变它为int的建议,但后来我有一个新问题。它会引发某种语法错误,因为当>和<=时,int和string并不是真的喜欢它。 如果我用我原来的代码去,它可以很好地工作,如果我选择另一个范围,比如从199到499. – dQlle