C# ObjectDataSource在gridview外部使用,未传递开始、页面大小或排序

C# ObjectDataSource在gridview外部使用,未传递开始、页面大小或排序,c#,asp.net,C#,Asp.net,我有一个与GridView绑定的现有ObjectDataSource,该GridView生成数据的html表示。需要为不同的输出类型(pdf、excel等)添加按钮,所以我觉得很好,我将使用相同的数据源来合并所有过滤参数,然后调用ObjectDataSource.Select()来获取数据集,并运行不同的例程来进行输出 在大多数情况下,它是有效的,但由于某种原因,我在onselection中为排序表达式、起始索引和页面大小设置的参数没有传递到选择方法 举例来说,数据源如下所示: <asp:

我有一个与GridView绑定的现有ObjectDataSource,该GridView生成数据的html表示。需要为不同的输出类型(pdf、excel等)添加按钮,所以我觉得很好,我将使用相同的数据源来合并所有过滤参数,然后调用ObjectDataSource.Select()来获取数据集,并运行不同的例程来进行输出

在大多数情况下,它是有效的,但由于某种原因,我在onselection中为排序表达式、起始索引和页面大小设置的参数没有传递到选择方法

举例来说,数据源如下所示:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetUsers"
    EnableCaching="false" TypeName="App.UserManager"
    EnablePaging="True" SelectCountMethod="GetUsersByParamCount"
    OnSelecting="SetFilterInputs" SortParameterName="sortedBy" />
然后,实际的按钮单击方法

if ((object)ButtonClicked == (object)GeneratePdfReportButton)
{
    IEnumerable<UserItem> results = (IEnumerable<UserItem>)ObjectDataSource1.Select();
    ... go create pdf output from the data set.
if((对象)按钮单击==(对象)GeneratePDReportButton)
{
IEnumerable结果=(IEnumerable)ObjectDataSource1.Select();
…从数据集中创建pdf输出。
我已经逐步介绍了onselection方法,并且正在设置开始索引和页面大小值,但是当ObjectDataSource1.Select()在SelectMethod结束时,所有过滤器输入都被正确设置,除了startRowIndex、maximumRows和sortedBy,它们分别以0、0和“”的形式出现

我读过很多关于数据源配置和参数传递的文章,有人说gridview值将覆盖您声明的默认值

但是我没有看到关于直接调用ObjectDataSource.Select()的任何信息,也没有看到为什么会分别删除这些参数(即使在OnSelecting方法的e.InputParameters中设置了这些参数)。正如我所说,所有其他过滤器参数都正确传递了,只是默认的分页参数没有

我仔细检查了ObjectDataSource.EnablePaging=true

有人有什么提示吗


谢谢

好吧,这有点麻烦,但是我们已经准备了很多代码来处理我们所有的自定义过滤器,这就是为什么我不想浪费它

请参阅上面的注释,了解我对ObjectDataSource.Select()的了解,以及当直接调用它时{sort expression,start index,and page size}如何/为什么会崩溃

直接对其他输出格式使用ObjectDataSource.Select()的快速且(非常)肮脏的方法是添加2个red herring参数(在我的例子中,我希望其他输出格式的开始索引为0)

当单击其他输出格式按钮时,我将ObjectDataSource上的排序表达式和页面大小参数名称重命名为red herrings(比如SortX和MaxX),并像往常一样填充常规名称。stub ObjectDataSourceView将把red herrings添加到参数列表中

如果它是绑定到gridview的html输出,那么我将自己向集合添加red herring参数,以便保持平衡


因此,现在我可以直接使用ObjectDataSource来驱动所有其他不可绑定的容器输出格式。

好的,我已经深入研究了这个问题,当文档暗示ObjectDataSource.Select()时,它出现了可以独立使用它确实不完全。使用Reflector,我发现SelectParameters集合中sortedBy、startRowIndex和maximumRows的值实际上被忽略,而您正在使用的任何绑定容器(如果有的话)上的设置都会被忽略。如果您没有绑定容器,请调用.Select()然后直接创建ObjectDataSourceView,其中有一个存根DataSourceArguments,所有这些都是空的,空值会吹走集合中的任何内容。在进一步挖掘之后,我发现了一些帖子(包括Rick Stahl的一篇博客文章),建议通过一个OnRowCommand处理程序(DataTable)获得它的方法GridView.DataSource).Rows。但是a)这使用的是Sql数据源,而不是ObjectDataSource,b)它似乎依赖于它是呈现结果的回发操作。我尝试使用OnRowDataBound执行相同的操作,GridView.DataSource始终为空。不知道这是因为我选择的事件还是更通用的ObjectDataSource。
if ((object)ButtonClicked == (object)GeneratePdfReportButton)
{
    IEnumerable<UserItem> results = (IEnumerable<UserItem>)ObjectDataSource1.Select();
    ... go create pdf output from the data set.