有人知道使DataSourceSelectArguments密封的逻辑吗?
我为一些自定义业务对象和自定义WebControl实现了自定义DataSource(和相关类)。在思考过滤器时(比如在网格中),我发现DataSourceSelectArguments是密封的。当然,我错过了一些东西。 (也许这个逻辑与再次询问数据库是无意义的事实有关,只是为了过滤?,只是猜测。)
答案 0 :(得分:1)
抱歉延迟,我是在神圣的日子。 :)
问题是像ListView这样的DataBoundControl有一个SortExpression属性,但不是FilterExpression。可以通过激活PostBack和Command事件的IButtonControl WebControl实现带有ListView的可排序网格/列表。然后使用SortExpression或Sort方法并传递一个排序表达式,该表达式将填充DataSourceSelectArguments.SortExpression并将其传递给DataSource,DataSource可以构造适当的SQL语句(在我的例子中)以从DB检索数据。这允许数据和显示它的WebControl之间的分离,恕我直言。
遵循这个模式我将通过在我的DataSourceSelectArguments中使用请求的过滤器填充额外的参数对象来实现过滤器,我将调用Sort,它将把这个arguments对象传递给DataSource,我将构建它适当的选择条款。
我最终通过在SortExpression中“编码”过滤器信息来解决它,但我发现它很难看(对于名称,首先是:sort!= filter),我想知道是否有更合适的这样做的方式,或者如果我错过了一些更微妙的东西。
修改强>:
也许更好的方法是覆盖ListView
的{{1}}方法并询问我自己实施的PerformSelect
是否可以过滤,然后调用特殊的DataSourceView
接受带有过滤器对象的特殊ExecuteSelect
的方法。当然,当有人使用非增强型DataSourceSelectArguments
的自定义ListView
时,请注意不要做任何破坏。
答案 1 :(得分:0)
我的猜测是因为该类是一个愚蠢的数据传输对象,仅用于将参数传递给方法。
这个类本身没有定义任何操作,因此你期望什么样的多态?例如,现有方法只能知道这个类的属性,这些属性都是可设置的,因此不需要覆盖属性。如果您添加了新属性,它们将被忽略。
对于您自己的方法,您是否可以创建自己的Arguments类,恰好具有所有相同的属性?