使用自定义页面控件对整个GridView进行排序

时间:2015-05-28 19:05:15

标签: c# sql asp.net sql-server-2008 gridview

在我的GridView中,我在创建自定义分页控件时关闭了分页。我有一个SQL存储过程,我传入页码作为参数返回。我现在遇到的问题是排序不再适用于返回的当前记录1000.当我打开排序时,当前的1000条记录集被排序,而不是整个记录集。我很确定这是因为我的存储过程也只返回了1000条记录。我能想到完成我要做的事情的唯一方法是将所有列名作为case语句传递,并根据它们作为附加参数进行排序。必须有比这更好的方法。有什么想法吗?

这是我目前正在做的事情,没有排序就可以正常工作。 @StartRow和@EndRow总是基于传递的页码,其中@StartRow等于页码* 1000(每页返回1000行)。

@StartRow INT,
@EndRow INT
AS

SELECT * FROM
    (
    SELECT ROW_NUMBER() OVER (ORDER BY EmployeeID) AS Row,
        HR.EmployeeID, HR.FirstName, HR.LastName,
        ISNULL(Locations.City,'') + ', ' + ISNULL(Locations.State,'') as LocationName
    FROM HR
        INNER JOIN Locations ON HR.LocationID = Locations.LocationID
    ) AS X
GROUP BY X.Row, X.EmployeeID, X.FirstName, X.LastName
HAVING X.Row BETWEEN @StartRow AND @EndRow
ORDER BY X.Row

这是我在使用自定义分页控件时完成排序的唯一方法。虽然我认为有一种更好的方式,但不会浮现在脑海中。

@StartRow INT,
@EndRow INT,
@Sort nvarchar(25)
AS

CREATE TABLE #Temp1
(
            EmployeeID nvarchar(25),
            FirstName nvarchar(25),
            LastName nvarchar(25),
            LocationName nvarchar(25)
)

INSERT INTO #Temp1
SELECT * FROM
    (
    SELECT 
        HR.EmployeeID, HR.FirstName, HR.LastName,
        ISNULL(Locations.City,'') + ', ' + ISNULL(Locations.State,'') as LocationName
    FROM HR
        INNER JOIN Locations ON HR.LocationID = Locations.LocationID
    ) AS X
GROUP BY X.EmployeeID, X.FirstName, X.LastName, X.LocationName

SELECT * FROM
    (
    SELECT ROW_NUMBER() OVER (ORDER BY 
                                CASE 
                                    WHEN @Sort = 'EmployeeID' THEN #Temp1.EmployeeID 
                                    WHEN @Sort = 'FirstName' THEN #Temp1.FirstName
                                    WHEN @Sort = 'LastName' THEN #Temp1.LastName
                                    WHEN @Sort = 'LocationName' THEN #Temp1.LocationName
                                    ELSE #Temp1.EmployeeID
                                END 
    ) AS Row, *
    FROM #Temp1 
    ) AS X
WHERE X.Row BETWEEN @StartRow AND @EndRow

drop table #Temp1

1 个答案:

答案 0 :(得分:0)

您可以构建一个包含sql语句的字符串,然后执行该字符串...

SET @SqlString = N'SELECT... ORDER BY ' + @Sort
EXECUTE sp_executesql @SQLString

你需要真正约束@Sort字符串,这样你就不会受到sql注入的攻击,但是如果确保字符串被清理了,那么这应该没问题。

另外,出于同样的原因(为了防止sql注入),你需要将startrow和endrow视为参数,或者再次对它们进行清理,然后将它们作为文字插入到SqlString中。