Step 1
Write SP for items selection:
Input parameters:
@StartIndex int,
@PageSize int,
@ItemType int -- this is sample
-- Select count of all items. It will be VirtualItemsCount
SELECT COUNT(*) AS ItemsCount
FROM Table
WHERE ItemType = @ItemType;
-- Select items needed for current page only
WITH SelectedItems AS
(
SELECT ROW_NUMBER OVER(ORDER BY ID) AS RowID, *
FROM Table
WHERE ItemType = @ItemType
)
SELECT TOP(@PageSize)
FROM SelectedItems
WHERE RowID > @StartIndex;
Step 2
Write data adapter which is used as ObjectDataSource. This step is needed because GridView doesn't support VirtualItemsCount property directly. If we want to know how many items we've selected we should add totalItemsCount variable (as "out") to the parameters list while configuring data source. Take into account that in such case GridView will call all methods with that parameter!
public class SampleDataAdapter
{
private int itemsCount;
public int GetItemsCount(int itemType, out int totalItemsCount)
{
totalItemsCount = -1 // We don't need to return it here
return itemsCount;
}
public List<Items> GetData(int itemType, out int totalItemsCount, int startRow, int maxRows)
{
// retreive data using itemType, startRow, maxRows
List<Items> result = ItemDAL.GetByType(itemType, startRow, maxRows, out itemsCount);
totalItemsCount = itemsCount;
return result;
}
}
Step 3
Configure GridView to use ObjectDataSource with you SampleDataAdapter:
public void DataBind()
{
ObjectDataSource objectDataSource = new ObjectDataSource();
objectDataSource.EnablePaging = SampleGridView.AllowPaging;
objectDataSource.EnableViewState = false;
objectDataSource.TypeName = "SampleDataAdapter";
objectDataSource.SelectMethod = "GetData";
objectDataSource.SelectCountMethod = "GetItemsCount";
objectDataSource.StartRowIndexParameterName = "startRow";
objectDataSource.MaximumRowsParameterName = "maxRows";
objectDataSource.SelectParameters.Add("itemType", itemType);
Parameter itemsCountParameter = new Parameter("totalItemsCount");
itemsCountParameter.Direction = ParameterDirection.Output;
objectDataSource.SelectParameters.Add(itemsCountParameter);
objectDataSource.Selected += new ObjectDataSourceStatusEventHandler(objectDataSource_Selected); // Subscribe for Selected event to be able to select totalItemsCount. Be aware - it is fired whenever any method of SampleDataAdapter is called.
SampleGridView.DataSource = objectDataSource;
SampleGridView.DataBind();
}
private void objectDataSource_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
int itemsCount = (int)e.OutputParameters["totalItemsCount"];
// "Selected" event may be raised when GetItemsCount method of our SampleDataAdapter is called. So, we need to check that we are on the right step of data binding process
if (itemsCount != -1)
{
// here we have totalItemsCount
}
}