标题:哪位了解ASP.Net的控件SqlDataSource,其中的Filter功能使用时候有些问题
取消只看楼主
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
结帖率:100%
已结贴  问题点数:20 回复次数:14 
哪位了解ASP.Net的控件SqlDataSource,其中的Filter功能使用时候有些问题
在FilterParameters中绑定多个控件参数并在FilterExpression中进行过滤,只要任何一个绑定的控件参数值为空,就不会执行过滤...

我希望能够,我只对任一个绑定的参数控件输入要过滤的参数值,就能立刻执行过滤


[ 本帖最后由 hysoka 于 2010-8-18 17:17 编辑 ]
搜索更多相关主题的帖子: ASP 控件 Net Filter 
2010-08-18 16:54
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
得分:0 
以下是引用冰镇柠檬汁儿在2010-8-18 21:57:05的发言:

你可以在代码里对这些值都写一个默认值,修改其中一个,其他的值还都是默认的,这样就可以进行过滤了
首先对版主的回复表示感谢,我再详细描述下:
SqlDataSource控件的FilterParameters属性中设置三个参数,分别绑定到两个textbox和一个dropdownlist,通过这三个控件中的值作为过滤条件来对SDS的DataSet查询进行过滤,并在GridView中实时体现出来。过滤表达式如下形式:FilterExpression="a1 like '%{0}%' and a2 like '%{1}%' and a3 = '{2}'";那么默认情况下是不对查询进行任何过滤的,也就是三个控件中的值都为空。

那么现在出现的情况是,三个控件中的值有任何一个为空,整个过滤条件都不发挥作用,而我的希望是任何一个控件中的值被我输入了过滤条件后都能有相应的变化

不知我对你回复的理解是否正确,或者我对该控件的Filter机制不太了解,你建议我设置默认值,岂不是页面加载后默认就要带条件过滤查询结果,那恐怕不是我的本意...我希望是哪个控件值没有输入,哪个控件所绑定的过滤字段就不进行过滤

[ 本帖最后由 hysoka 于 2010-8-20 18:03 编辑 ]
2010-08-19 00:39
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
得分:0 
我是从三层架构转向混搭的,随着.Net下开发的时间越久,觉得MS提供的功能性控件一般比程序员手写功能要高效的多,而且开发过程更为简洁。我不喜欢被所谓的框架忽悠,虽然这样违背了三层架构和MVC体系,但我觉得混搭不失为一种RAD的方法。以上题外话,如果解决不了这个问题,我也要用回拼接查询条件的方法了。

最后请教版主一个问题,有什么办法,或者你协助我调整下已发帖的分值。我是昨天注册的论坛,当时默认只有20分,我不太清楚就在这个帖子全部给出了,导致我另一帖子只能给0分。我想两个帖子各10分,谢谢
2010-08-19 12:51
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
得分:0 
回复 5楼 bygg
谢谢版主的回复,那么你建议的核心内容是拼接时避免使用“{0}”这样的占位符,转而用实际确定的值来提交过滤么?
2010-08-19 13:00
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
得分:0 
回复两位版主,帖子分的事就不多考虑了,但是在C#区中发的另一帖子昨天因为没分可给了,就悬赏分设为0,不知是不是因为这个原因至今没人回复。

至于VS2010,我现在就在用这个开发,以前是用2005做.NET多一些。至于开发经验,相较而言,.NET里以前做WinForm的程序多些。你所指的2010中所推广的MVC2开发框架我了解一些,MVC的原理和思想也知道些;我以前是坚定的三层体系拥护者,也从不会去用数据源控件来破坏View层;但现在的观点已经有所改变,个人不会再拘泥于一种死板的框架思想,转而更倾向于按需定制,如果适合RAD的产品,我想我会支持高效的.NET自带控件。

回复9楼版主“7楼的bygg说的是对的,应该不用现成的数据控件,不知道楼主接触2010了没,现在.NET的思想已经逐渐的鼓励大家用html控件去写了,也就是说微软已经在逐渐的摒弃自己的很多.NET控件了,这又能说明什么问题呢?”,这句话并不能说MS已经抛弃自己的.NET控件,WYSWYG是MS一直倡导的理念,任何集成IDE都不敢抛弃数据类相关控件,而相反都只会更加用心于数据控件的性能、易用性和良好的UX,举例来说MS在.NET4.0版中对SqlDataSource控件的改进较.NET3.5中非常明显。版主所理解的MS鼓励使用HTML控件,其实是MVC2架构中倡导的View层中使用客户端控件来代替原先使用的ASP控件,是MS推广MVC2框架时的一点需求,并不是希望所有程序员都去屏弃ASP控件。

以上纯个人的技术见解,与两位版主交流,入行不深露怯之处别见笑~
2010-08-19 13:52
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
得分:0 
以下是引用bygg在2010-8-19 13:35:58的发言:

不是避免使用“{0}”这样的占位符。
而是尽可能不用它自带的那些数据控件,自己通过写代码来实现。
认同两位提出的改进建议,但我发帖目的主要是求解。想知道我所叙述出来的过滤不正常情况是如何引发的,又该如何调整该控件延续我现有的开发结构解决。

即:何故?何解?

谢谢
2010-08-19 13:57
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
得分:0 
以下是引用bygg在2010-8-19 14:04:16的发言:

因为在MVC中,许多东东都由控制器完成了,而我们的页面大多是接收由控制器处理好的数据,再进行展示,所以用asp控件就显得有些多余了(这种情况下,不再需要与服务端进行交互),所以MS提倡用html控件,自然是对的。但是用asp控件也同样可以实现,只是出于对网站的优化方面考虑,用asp控件,有些多余而已。
同时,MS并没有说要抛弃asp控件,只是想告诉大家,在什么情况下用什么,得根据实际情况来定,
完全赞同bygg的观点,我也是这个意思,但可能表达不清楚。

另外我说的三个过滤条件控件值有任何一个为空(即未设置过滤条件),然后并不是报错,而是三个过滤条件都失效了,也就是变成默认执行selectCommand,将DataSet全部输出来。但我能确定页面执行了_doPostBack,也就是触发了Filtering事件

[ 本帖最后由 hysoka 于 2010-8-19 17:26 编辑 ]
2010-08-19 14:12
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
得分:0 
以下是引用冰镇柠檬汁儿在2010-8-19 14:11:32的发言:

“以上纯个人的技术见解,与两位版主交流,入行不深露怯之处别见笑”
千万别这么说,你的见解很好,呵呵
我觉得的思想已经从webform开始像form方式转变了,它推出了mvc2就是很好的证明,如果它不想转变的话,大可按照自己的路继续走,当然现在它也没放弃原有的方式,呵呵
框架思想给我带来的,我觉得并不是死板,反倒是灵活,就像活字印刷一样,你不这么觉得吗?呵呵

一个好的框架和技术架构,我也是非常喜欢的,现在MVC3已经发布预览版1了,我也会一直关注的。版主误会了,我并不想说用框架就死板,我是想表明两个观点:1.并不是一做开发就要用纯的MVC架构或者三层体系,有些时候比如我想用RAD方法去开发,完全可以改动一下,集成一些数据源控件,省去不少麻烦;2.事实上,MS在CLR上有得天独厚的优势,对.NET控件的优化程度是非常高的,用它的控件要比大多数程序员自己写代码要高效和简洁的多
2010-08-19 14:21
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
得分:0 
谢谢“bygg”版主,你的方法很奏效,同时我刚刚也找出了出现问题的根源,在此一并公布以供大家参考。

SqlDataSource有个bool属性CancelSelectOnNullParameter:如果设为True,在执行Select时,任意一个查询条件参数值为Null时跳过整个Where子句;
FilterParameters属性集合中的任意参数值中有这样一个bool属性ConvertEmptyStringToNull,并且默认值为True:顾名思义很容易理解,当给定的参数值为空串时,转换它为Null
FilterParameters属性集合中的任意参数值中还有个DefaultValue:参数值为Null时使用默认值

那么问题看似是找到了,任选一个解决方案吧:

1.将CancelSelectOnNullParameter设为False?可惜不行,一点效果也没有。是因为这个参数只能负责SelectCommand,Filter机制下CancelSelectOnNullParameter默认即为True? or VS2010目前版本存在Bug? 以上猜测就不得而知了。

2.将ConvertEmptyStringToNull设为False?这样未设置过滤值的参数会传一个空串而不是Null,过滤条件将会执行。看似完美的解决方案,可惜有局限性,如果FilterExpression中使用如a1='{0}'这种格式,实际过滤条件就变为a1='',那你就只能查到字段a1为空串的情况了;你说用是like?也不完满,like ''与=''实际效果一样的;要想用这种解决办法,你只能保证你的过滤格式形如like '%{0}%',至少要带一个‘%’。

3.将ConvertEmptyStringToNull设为True,并设置默认为'%';与方法2类似,但可以支持like '{0}'这样的格式。

4.再加上版主提供的“*”默认值方法,用法同方法3,暂列为第4种方法。

现在对版主的方法有一个疑问:“*”值是什么?我确定不是Sql中的通配符,不知是.NET提供的?还是C#?还是LINQ(LINQ我不熟)?

[ 本帖最后由 hysoka 于 2010-8-19 17:25 编辑 ]
2010-08-19 17:23
hysoka
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-8-18
得分:0 
以下是引用bygg在2010-8-19 17:50:38的发言:

SqlDataSource有个bool属性CancelSelectOnNullParameter:如果设为True,在执行Select时,任意一个查询条件参数值为Null时跳过整个Where子句;

我就在找这样的属性,没找到,呵呵.
学无止境啊……

在sql中,*代表任何字符,嘿嘿。

“在sql中,*代表任何字符,嘿嘿。”

这么说是不确切的,*可以代表查询表达式中的所有字段列;可是无法用在where子句中做条件表达,可以Sql Server中验证条件子句形如a1=* / a1='*' / a1 like '*' 均不能体现a1匹配任意字符串作用,要么出错要么仅匹配字段值为‘*’的记录;而是该用a1 like '%';事实上在sql中较常用的是 _ 通配 任意一个字符, % 通配任意长度字符串;说了这么多可是版主给的默认值设为*的解决办法很有效,所以我百思不得其解,*在这里面起到什么作用?

有事要离开了,今晚不能上网,盼你的回复,明天再看

[ 本帖最后由 hysoka 于 2010-8-20 09:10 编辑 ]
2010-08-19 18:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-316106-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.070503 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved