ASP.NET - 尝试将SortParameterName属性实现为SqlDataSource

时间:2012-08-24 13:34:21

标签: asp.net sqldatasource

我有几个Gridview和Repeater使用存储过程绑定到SqlDataSources。我正在尝试将排序功能实现到其中一些中,但是很难找到具体的指令和/或SqlDataSource端需要生成所需ORDER BY的示例。特别是,我不明白在SqlDataSource中有一个SortParameterName属性,如果它只是手动连接到存储过程中的ORDER BY子句。为什么如果它只是SelectParameters列表中的另一个参数,就像任何其他参数一样定义它,但恰好连接到ORDER BY子句?当我运行下面的代码示例时,我被告知指定了太多的参数(显然,额外的SortParams参数)。我是否真的需要更改我的存储过程并在现有查询的末尾添加“ORDER BY @SortParams”子句以使其工作?我觉得我错过了什么。

    SqlDataSourceInLine.SelectParameters.Clear()
    SqlDataSourceInLine.SelectCommandType = SqlDataSourceCommandType.StoredProcedure
    SqlDataSourceInLine.SelectCommand = "ApproverGetApproved"
    SqlDataSourceInLine.SelectParameters.Add("CompanyID", ConfigurationManager.AppSettings("Temp_CompanyID"))
    SqlDataSourceInLine.SelectParameters.Add("SortParams", "EmpName DESC")
    SqlDataSourceInLine.DataSourceMode = SqlDataSourceMode.DataSet
    SqlDataSourceInLine.SortParameterName = "SortParams"
    Dim dv As DataView = SqlDataSourceInLine.Select(DataSourceSelectArguments.Empty

任何澄清都将不胜感激!

3 个答案:

答案 0 :(得分:3)

我只是想弄清楚如何使用SortParameterName并找到了这个问题。在做了一些搜索之后,我想我现在找到了正确的答案。

微软页面Sorting Data with Data Source Controls如下(我的重点):

  

SortParameterName属性标识的参数传递给ObjectDataSource控件的SelectMethod或作为参数集合的一部分传递给SqlDataSource控件的SelectCommand。 ObjectDataSource控件可以使用在sort参数中传递给它的信息,以按排序顺序返回数据。 对于SqlDataSource控件,您必须提供可以获取sort参数并返回已排序数据的存储过程的名称,,因为您不能将参数作为ORDER BY子句的一部分传递。

这表明伊卡洛斯给出的答案是不正确的。

我的结论是,当设置SortParameterName属性(与适当的存储过程结合)时,Gridview本身不会进行排序,但会让数据源执行所谓的自定义排序,例如,这将是必要的如果使用自定义分页,则排序方式。

<强>更新
我现在在自己的编程中使用它并确认我的结论是正确的。

答案 1 :(得分:0)

我以前从未使用SortParamter,但我收集from the documentation的原因是此参数的目的是让您以您希望的方式对结果进行排序< strong>如果存储过程尚未执行此操作。除此之外,您不需要将其用于任何操作。其数据源类型为SqlDataSource的GridView已经实现了开箱即用的排序。您只需将AllowSorting属性设置为True,并将SortExpression设置为每列。

示例:

 <asp:GridView ID=" productsGridView" Runat="server" 
     DataSourceID="SqlproductDataSource" AutoGenerateColumns="False"
        AllowSorting="True" >
        <Columns>
            <asp:BoundField HeaderText="Product" 
              DataField="ProductName" SortExpression="ProductName">
            </asp:BoundField>
  ...

答案 2 :(得分:0)

SqlDataSource不需要任何内容​​。您需要为Gridview实现Sorting事件,并为转发器实现其他内容,因为它们没有内置排序。您可以做什么(如果您有小数据集返回)是使用ViewState并存储DataTable结果和然后利用DataView及其排序功能,然后将Repeaters / GridViews绑定到已排序的DataView。无论如何,您仍然必须跟踪ViewState中的SortDirection和SortParameter。