【发布时间】:2015-08-11 11:11:09
【问题描述】:
在我的 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
【问题讨论】:
标签: c# sql asp.net sql-server-2008 gridview