Rendering GridView Rows when scrolling down using AJAX
In previous post, We had seen how to render the GridView rows from the server and show while scrolling the GridView.
This is a continuation of that post which discuss the third implementation. I had explained the background of this implementation in the first post. So, It is better to read the post for understanding how it is been implemented (but there is no dependency in the code).
Third Implementation
In the previous implementation, the new records are fetched from the server and add at the end of the GridView while scrolling down at the end of the GridView. In this implementation I wish to show how to fetch records page by page in background once the page gets loaded and add at the end of the GridView.
Here, the page will not wait for the user to scroll down to the end of the GridView to trigger the server to fetch the next records, instead the page will show minimum two pages initially while loading the page. Once the page loaded, the page will automatically starts the process to fetch other records page by page from the server and adds to the GridView. Note: I set two pages when page loads - 10 for each page => So 20 records totally, which can be modified programatically.
The use case will be -
Implementation without Sorting in GridView
The ASPX script (FetchOnBackgroundSorting.aspx)
The C# Code behind (FetchOnBackgroundSorting.aspx.cs)
The Javascript (FetchOnBackgroundSorting.aspx)
The CSS Stylesheet (FetchOnBackgroundSorting.aspx)
The Respondent ASPX script (RowsBuilder.aspx)
The Code behind file of Respondent (RowsBuilder.aspx.cs)
The Class for fetching the Data from Database (ProductDAO.cs)
The ProductView entity class
The Database script
Implementation with Sorting in GridView
The code for this implementation will be same as above, with additionally below code.
Add below Style Sheet
The ASPX Script (ProcessMessageSorting.aspx)
Add one hidden control hiddenSortExpression in the Page and add sorting event for the GridView.
The C# Codebehind (ProcessMessageSorting.aspx.cs)
The Javascript
The output of this code would be:
The vedio output download the working copy of the source code in C# here and in VB here.
This is a continuation of that post which discuss the third implementation. I had explained the background of this implementation in the first post. So, It is better to read the post for understanding how it is been implemented (but there is no dependency in the code).
Third Implementation
In the previous implementation, the new records are fetched from the server and add at the end of the GridView while scrolling down at the end of the GridView. In this implementation I wish to show how to fetch records page by page in background once the page gets loaded and add at the end of the GridView.
Here, the page will not wait for the user to scroll down to the end of the GridView to trigger the server to fetch the next records, instead the page will show minimum two pages initially while loading the page. Once the page loaded, the page will automatically starts the process to fetch other records page by page from the server and adds to the GridView. Note: I set two pages when page loads - 10 for each page => So 20 records totally, which can be modified programatically.
The use case will be -
- Show list of records in a GridView with all sort of customizations possible (such as colors, data formatting etc.,).
- The GridView should show all the records in a single page without having pagination.
- The GridView should have a scroll bar to scroll and see the records up and down.
- Initially the GridView should show only first two pages on the screen (or decided by the programmer on the code).
- Once the page loaded, the next 10 records (set programatically) will be fetched from the server and added to the GridView without the need of scrolling down to the end. The same will be repeated in background without user interaction till the end record reached.
- Without sorting option on the GridView
- With Sorting on the GridView.
Implementation without Sorting in GridView
The ASPX script (FetchOnBackgroundSorting.aspx)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| < div id = "GridViewContainer" style = "width:100%;height:400px;" onscroll = "RefreshRows(this)" > < asp:GridView ID = "grdViewProducts" CssClass = "ViewProducts" runat = "server" AutoGenerateColumns = "False" TabIndex = "1" AllowPaging = "false" DataKeyNames = "ProductID" Width = "100%" GridLines = "Both" CellPadding = "3" AllowSorting = "false" BackColor = "White" > < Columns > < asp:BoundField DataField = "ProductName" HeaderText = "Product Name" SortExpression = "ProductName" > < ItemStyle Width = "26%" /> </ asp:BoundField > < asp:BoundField DataField = "CategoryName" HeaderText = "Category" SortExpression = "CategoryName" > < ItemStyle Width = "17%" /> </ asp:BoundField > < asp:BoundField DataField = "QuantityPerUnit" HeaderText = "Quantity/Unit" SortExpression = "QuantityPerUnit" > < ItemStyle Width = "17%" /> </ asp:BoundField > < asp:BoundField DataField = "UnitPrice" HeaderText = "Unit Price" SortExpression = "UnitPrice" DataFormatString = "{0:#0.00}" > < ItemStyle Width = "10%" /> </ asp:BoundField > < asp:BoundField DataField = "UnitsInStock" HeaderText = "Units In Stock" SortExpression = "UnitsInStock" > < ItemStyle Width = "10%" /> </ asp:BoundField > < asp:BoundField DataField = "UnitsOnOrder" HeaderText = "Units On Order" SortExpression = "UnitsOnOrder" > < ItemStyle Width = "10%" /> </ asp:BoundField > < asp:BoundField DataField = "ReorderLevel" HeaderText = "Reorder Level" SortExpression = "ReorderLevel" > < ItemStyle Width = "10%" /> </ asp:BoundField > </ Columns > < EmptyDataTemplate > < div > < p style = "color:Red" >No search results found.</ p > </ div > </ EmptyDataTemplate > < PagerSettings Position = "Bottom" /> < RowStyle BackColor = "#E7E7FF" ForeColor = "#4A3C8C" /> < FooterStyle BackColor = "#B5C7DE" ForeColor = "#4A3C8C" /> < PagerStyle BackColor = "#E7E7FF" ForeColor = "#4A3C8C" HorizontalAlign = "Right" /> < SelectedRowStyle BackColor = "#738A9C" Font-Bold = "True" ForeColor = "#F7F7F7" /> < HeaderStyle BackColor = "#4A3C8C" Font-Bold = "True" ForeColor = "#F7F7F7" /> < AlternatingRowStyle BackColor = "#F7F7F7" /> < SortedAscendingCellStyle BackColor = "#F4F4FD" /> < SortedAscendingHeaderStyle BackColor = "#5A4C9D" /> < SortedDescendingCellStyle BackColor = "#D8D8F0" /> < SortedDescendingHeaderStyle BackColor = "#3E3277" /> </ asp:GridView > < div id = "divChildGrid" > </ div > </ div > < input id = "hiddenInitialNoOfPageLoad" type = "hidden" value = "0" runat = "server" /> < input id = "hiddenTotalRecords" type = "hidden" value = "0" runat = "server" /> < input id = "hiddenPageRecordCount" type = "hidden" value = "0" runat = "server" /> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| protected void Page_Load( object sender, EventArgs e) { if (!Page.IsPostBack) { hiddenInitialNoOfPageLoad.Value = "2" ; hiddenPageRecordCount.Value = ConfigurationManager.AppSettings[ "PageRecordCount" ].ToString(); BindGrid(); } } private void BindGrid() { // Defining int variable to get the Total Record Count from Data layer int totalRecordCount = 0; // Getting how many records required to show in the Grid per page int intPageRecordCount = Convert.ToInt32(hiddenPageRecordCount.Value) * 2; // I am fetching 3 pages at first time ProductDAO objProductDAO = new ProductDAO(); IList<ProductView> ProductViewList = objProductDAO.GetProducts(1, intPageRecordCount, string .Empty, SortType.Ascending, out totalRecordCount); // Getting First three pages //Adding one empty row for just to show the grid if (ProductViewList.Count == 0) ProductViewList.Add( new ProductView()); grdViewProducts.DataSource = ProductViewList; grdViewProducts.DataBind(); // Assign the Total Record count to hiddenTotalRecords.Value = totalRecordCount.ToString(); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
| var is_ie = (navigator.userAgent.indexOf( 'MSIE' ) >= 0) ? 1 : 0; var is_ie5 = (navigator.appVersion.indexOf( "MSIE 5.5" ) != -1) ? 1 : 0; var xmlHttp; var varStartAJAXPage = 3; var varPageOnBehind = 0; var varBackgroundJobCanStart = 0; function pageLoad() { GetChildGrid(varStartAJAXPage); varBackgroundJobCanStart = 1; } window.onload = pageLoad; function ProcessOnBackground() { var time = new Date(); if (parseInt(varBackgroundJobCanStart) == 1) RefreshRows(document.getElementById( 'divChildGrid' )); } ProcessOnBackground(); window.setInterval(ProcessOnBackground, 1000); /* This function requests the HTTPRequest, will be used to render the Dynamic content html markup * and it will call HandleResponse to handle the response */ function GetChildGrid(pageId) { // Get the Div var childGridDiv = document.getElementById( "divChildGrid" ); if (childGridDiv) { // If the Child Grid is not fetched, then go and fetch it. var varTotalRecords = document.getElementById( '' ).value; var varPageRecordCount = document.getElementById( '' ).value; if ((pageId > 0) && (parseInt(varTotalRecords) > (parseInt(varPageRecordCount) * (parseInt(pageId) - 1)))) { var url = 'RowsBuilder.aspx?PageId=' + pageId + '&PageRecordsCount=' + varPageRecordCount; xmlHttp = createAjaxObject(); if (xmlHttp) { xmlHttp.open( 'get' , url, true ); xmlHttp.onreadystatechange = function () { HandleResponse(pageId); } varPageOnBehind = varStartAJAXPage; xmlHttp.send( null ); } } } } function RefreshRows(div) { if (varStartAJAXPage - varPageOnBehind > 0) { if (div.scrollHeight - (div.scrollTop + div.offsetHeight) < 200) { varPageOnBehind = varStartAJAXPage; GetChildGrid(varStartAJAXPage); } } } /* This function is used to handler the http response */ function HandleResponse() { var childGridDiv = document.getElementById( "divChildGrid" ); // If Response completed if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { // Here is the response var str = xmlHttp.responseText; var divRows = document.createElement( 'div' ); divRows.innerHTML = str; childGridDiv.appendChild(divRows); varStartAJAXPage++; xmlHttp.abort(); } } } /* function to create Ajax object */ function createAjaxObject() { var ro; var browser = navigator.appName; if (browser == "Microsoft Internet Explorer" ) { if (xmlHttp != null ) { xmlHttp.abort(); } ro = new ActiveXObject( "Microsoft.XMLHTTP" ); } else { if (xmlHttp != null ) { xmlHttp.abort(); } ro = new XMLHttpRequest(); } return ro; } /* Get the XML Http Object */ function GetXmlHttpObject(handler) { var objXmlHttp = null ; if (is_ie) { var strObjName = (is_ie5) ? 'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP' ; try { objXmlHttp = new ActiveXObject(strObjName); objXmlHttp.onreadystatechange = handler; } catch (e) { alert( 'Object could not be created' ); return ; } } return objXmlHttp; } function xmlHttp_Get(xmlhttp, url) { xmlhttp.open( 'GET' , url, true ); xmlhttp.send( null ); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| #GridViewContainer { overflow : auto ; } .ViewProducts { border-top-style : solid ; border-left-style : solid ; border-right-style : solid ; border-bottom-style : none ; } .ViewChildProducts { border-top-style : solid ; border-left-style : solid ; border-right-style : solid ; border-bottom-style : none ; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| < asp:GridView ID = "grdAJAXViewProducts" runat = "server" ShowHeader = "false" ShowFooter = "false" AutoGenerateColumns = "False" TabIndex = "1" AllowPaging = "false" DataKeyNames = "ProductID" Width = "100%" GridLines = "Both" CellPadding = "3" AllowSorting = "True" BackColor = "White" CssClass = "ViewProducts" > < Columns > < asp:BoundField DataField = "ProductName" HeaderText = "Product Name" SortExpression = "ProductName" > < ItemStyle Width = "26%" /> </ asp:BoundField > < asp:BoundField DataField = "CategoryName" HeaderText = "Category" SortExpression = "CategoryName" > < ItemStyle Width = "17%" /> </ asp:BoundField > < asp:BoundField DataField = "QuantityPerUnit" HeaderText = "Quantity/Unit" SortExpression = "QuantityPerUnit" > < ItemStyle Width = "17%" /> </ asp:BoundField > < asp:BoundField DataField = "UnitPrice" HeaderText = "Unit Price" SortExpression = "UnitPrice" DataFormatString = "{0:#0.00}" > < ItemStyle Width = "10%" /> </ asp:BoundField > < asp:BoundField DataField = "UnitsInStock" HeaderText = "Units In Stock" SortExpression = "UnitsInStock" > < ItemStyle Width = "10%" /> </ asp:BoundField > < asp:BoundField DataField = "UnitsOnOrder" HeaderText = "Units On Order" SortExpression = "UnitsOnOrder" > < ItemStyle Width = "10%" /> </ asp:BoundField > < asp:BoundField DataField = "ReorderLevel" HeaderText = "Reorder Level" SortExpression = "ReorderLevel" > < ItemStyle Width = "10%" /> </ asp:BoundField > </ Columns > < PagerSettings Position = "Bottom" /> < RowStyle BackColor = "#E7E7FF" ForeColor = "#4A3C8C" /> < FooterStyle BackColor = "#B5C7DE" ForeColor = "#4A3C8C" /> < PagerStyle BackColor = "#E7E7FF" ForeColor = "#4A3C8C" HorizontalAlign = "Right" /> < SelectedRowStyle BackColor = "#738A9C" Font-Bold = "True" ForeColor = "#F7F7F7" /> < HeaderStyle BackColor = "#4A3C8C" Font-Bold = "True" ForeColor = "#F7F7F7" /> < AlternatingRowStyle BackColor = "#F7F7F7" /> < SortedAscendingCellStyle BackColor = "#F4F4FD" /> < SortedAscendingHeaderStyle BackColor = "#5A4C9D" /> < SortedDescendingCellStyle BackColor = "#D8D8F0" /> < SortedDescendingHeaderStyle BackColor = "#3E3277" /> </ asp:GridView > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| protected void Page_Load( object sender, EventArgs e) { if ((!Page.IsPostBack) && (Request.QueryString[ "PageId" ] != null )) { Response.Clear(); Response.ContentType = "text/xml" ; BindGrid(); System.IO.StringWriter stringWrite = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); grdAJAXViewProducts.RenderControl(htmlWrite); Response.Write(stringWrite.ToString()); Response.End(); } } public override void VerifyRenderingInServerForm(Control control) { } private void BindGrid() { // Defining int variable to get the Total Record Count from Data layer int totalRecordCount = 0; string strSortExpression = string .Empty; SortType sortType = SortType.Ascending; if (Request.QueryString[ "SortExpression" ] != null ) { // Get the SortByExpression and SortType from Query String (by default, that will be updated in script) strSortExpression = Request.QueryString[ "SortExpression" ].ToString().Split( "," .ToCharArray())[0]; sortType = (SortType)Enum.Parse( typeof (SortType), Request.QueryString[ "SortExpression" ].ToString().Split( "," .ToCharArray())[1], true ); } // Getting how many records required to show in the Grid per page int intPageRecordCount = Convert.ToInt32(Request.QueryString[ "PageRecordsCount" ].ToString()); ProductDAO objProductDAO = new ProductDAO(); IList<ProductView> ProductViewList = objProductDAO.GetProducts(Convert.ToInt32(Request.QueryString[ "PageId" ].ToString()), intPageRecordCount, strSortExpression, sortType, out totalRecordCount); //Adding one empty row for just to show the grid if (ProductViewList.Count == 0) ProductViewList.Add( new ProductView()); grdAJAXViewProducts.DataSource = ProductViewList; grdAJAXViewProducts.DataBind(); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| public class ProductDAO { public IList<ProductView> GetProducts( int currentPageNo, int pageRecordsCount, string sortBy, SortType sortType, out int totalRecordCount) { SqlConnection connection = null ; SqlDataReader dataReader = null ; try { IList<ProductView> productViewList = new List<ProductView>(); connection = new SqlConnection(ConfigurationManager.ConnectionStrings[ "ConnectionString" ].ToString()); SqlDataAdapter dataAdaptor = new SqlDataAdapter( "SP_GET_PRODUCTS" , connection); dataAdaptor.SelectCommand.CommandType = System.Data.CommandType.StoredProcedure; dataAdaptor.SelectCommand.Parameters.Add( new SqlParameter( "@CurrentPageNo" , SqlDbType.Int)); dataAdaptor.SelectCommand.Parameters[ "@CurrentPageNo" ].Value = currentPageNo; dataAdaptor.SelectCommand.Parameters.Add( new SqlParameter( "@PageRecordsCount" , SqlDbType.Int)); dataAdaptor.SelectCommand.Parameters[ "@PageRecordsCount" ].Value = pageRecordsCount; dataAdaptor.SelectCommand.Parameters.Add( new SqlParameter( "@SortBy" , SqlDbType.VarChar)); dataAdaptor.SelectCommand.Parameters[ "@SortBy" ].Value = sortBy; dataAdaptor.SelectCommand.Parameters.Add( new SqlParameter( "@SortType" , SqlDbType.VarChar)); dataAdaptor.SelectCommand.Parameters[ "@SortType" ].Value = ((sortType == null ) ? string .Empty : (sortType == SortType.Ascending ? "Asc" : "Desc" )); dataAdaptor.SelectCommand.Parameters.Add( new SqlParameter( "@TotalRecordCount" , SqlDbType.Int)); dataAdaptor.SelectCommand.Parameters[ "@TotalRecordCount" ].Direction = ParameterDirection.Output; connection.Open(); DataSet dataSet = new DataSet(); dataAdaptor.Fill(dataSet); foreach (DataRow dataRow in dataSet.Tables[0].Rows) { ProductView productView = new ProductView(); productView.ProductID = Convert.ToInt32(dataRow[ "ProductID" ].ToString()); productView.ProductName = dataRow[ "ProductName" ].ToString(); productView.CompanyName = dataRow[ "CompanyName" ].ToString(); productView.CategoryName = dataRow[ "CategoryName" ].ToString(); productView.QuantityPerUnit = dataRow[ "QuantityPerUnit" ].ToString(); productView.UnitPrice = Convert.ToDouble(dataRow[ "UnitPrice" ].ToString()); productView.UnitsInStock = Convert.ToInt32(dataRow[ "UnitsInStock" ].ToString()); productView.UnitsOnOrder = Convert.ToInt32(dataRow[ "UnitsOnOrder" ].ToString()); productView.ReorderLevel = Convert.ToInt32(dataRow[ "ReorderLevel" ].ToString()); productViewList.Add(productView); } // To make more processing time //for (int i = 0; i < (1000000000/2); i++) { int b = 5 + 4 + 3 + 2 - 3; } totalRecordCount = Convert.ToInt32(dataAdaptor.SelectCommand.Parameters[ "@TotalRecordCount" ].Value); connection.Close(); //return return productViewList; } catch (Exception ex) { if (connection != null ) connection.Close(); if (dataReader != null ) dataReader.Close(); // Log throw ex; } } } |
1
2
3
4
5
6
7
8
9
10
11
12
| public class ProductView { public int ProductID { get ; set ; } public string ProductName { get ; set ; } public string CompanyName { get ; set ; } public string CategoryName { get ; set ; } public string QuantityPerUnit { get ; set ; } public double UnitPrice { get ; set ; } public int UnitsInStock { get ; set ; } public int UnitsOnOrder { get ; set ; } public int ReorderLevel { get ; set ; } } |
1
2
3
4
5
| public enum SortType { Ascending, Descending } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| Create View [dbo].[ProductView] As Select Products.ProductID, Products.ProductName, Suppliers.CompanyName, Categories.CategoryName, Products.QuantityPerUnit, Products.UnitPrice, Products.UnitsInStock, Products.UnitsOnOrder, Products.ReorderLevel from Products Join Suppliers on Suppliers.SupplierID = Products.SupplierID Join Categories on Categories.CategoryID = Products.CategoryID Go CREATE PROCEDURE [dbo].[SP_GET_PRODUCTS] @CurrentPageNo AS INT , @PageRecordsCount AS INT , @SortBy AS NVARCHAR(250), @SortType AS NVARCHAR(250), @TotalRecordCount AS INT OUTPUT AS SET NOCOUNT ON DECLARE @SQL AS NVARCHAR(1000) DECLARE @RecordsFrom AS INT DECLARE @RecordsTo AS INT -- RecordsFrom => For Ex: CurrentPage 2, PageRecordCount = 10, then (((2-1) * 10) + 1) => ((1 * 10) + 1) => 11 SET @RecordsFrom = (((@CurrentPageNo - 1) * @PageRecordsCount) + 1) -- @RecordsTo => For Ex: CurrentPage 2, PageRecordCount = 10, then (2 * 10) => 20 SET @RecordsTo = (@CurrentPageNo * @PageRecordsCount) IF @SortBy = '' OR @SortBy = NULL SET @SortBy = 'ProductName' IF @SortType = '' OR @SortType = NULL SET @SortType = 'Asc' -- Getting the Total Record Count SELECT @TotalRecordCount = COUNT (*) FROM ProductView -- Getting the records for a particular page SET @SQL = 'SELECT * FROM ' + '( ' + ' SELECT ' + ' ROW_NUMBER() OVER (ORDER BY ' + @SortBy + ' ' + @SortType + ') AS RowNumber, *' + ' FROM ProductView ' + ') AS RECORDS ' + 'Where RowNumber between ' + CAST (@RecordsFrom AS VARCHAR ) + ' and ' + CAST (@RecordsTo AS VARCHAR ) EXECUTE (@SQL) |
The code for this implementation will be same as above, with additionally below code.
Add below Style Sheet
1
2
3
4
5
6
7
8
9
10
| th a.sortdown { background : url (../../images/up.png) left center no-repeat ; padding-left : 22px ; } th a.sortup { background : url (../../images/down.png) left center no-repeat ; padding-left : 22px ; } |
Add one hidden control hiddenSortExpression in the Page and add sorting event for the GridView.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| < div id = "GridViewContainer" style = "width:100%;height:400px;" onscroll = "RefreshRows(this)" > < asp:GridView ID = "grdViewProducts" CssClass = "ViewProducts" runat = "server" AutoGenerateColumns = "False" TabIndex = "1" AllowPaging = "false" DataKeyNames = "ProductID" Width = "100%" GridLines = "Both" CellPadding = "3" AllowSorting = "True" BackColor = "White" onsorting = "grdViewProducts_Sorting" > < Columns > Add all the columns </ Columns > </ asp:GridView > < div id = "divChildGrid" > </ div > </ div > < input id = "hiddenInitialNoOfPageLoad" type = "hidden" value = "0" runat = "server" /> < input id = "hiddenTotalRecords" type = "hidden" value = "0" runat = "server" /> < input id = "hiddenPageRecordCount" type = "hidden" value = "0" runat = "server" /> < input id = "hiddenSortExpression" type = "hidden" value = "0" runat = "server" /> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| protected void Page_Load( object sender, EventArgs e) { if (!Page.IsPostBack) { hiddenInitialNoOfPageLoad.Value = "2" ; hiddenPageRecordCount.Value = ConfigurationManager.AppSettings[ "PageRecordCount" ].ToString(); hiddenSortExpression.Value = "ProductName,Ascending" ; BindGrid(); } } private void BindGrid() { // Defining int variable to get the Total Record Count from Data layer int totalRecordCount = 0; // Get the SortByExpression and SortType from View State (by default, that will be updated in script) string strSortExpression = hiddenSortExpression.Value.Split( "," .ToCharArray())[0]; SortType sortType = (SortType)Enum.Parse( typeof (SortType), hiddenSortExpression.Value.Split( "," .ToCharArray())[1], true ); // Getting how many records required to show in the Grid per page int intPageRecordCount = Convert.ToInt32(hiddenPageRecordCount.Value) * 2; // I am fetching 3 pages at first time ProductDAO objProductDAO = new ProductDAO(); IList<ProductView> ProductViewList = objProductDAO.GetProducts(1, intPageRecordCount, strSortExpression, sortType, out totalRecordCount); // Getting First three pages //Adding one empty row for just to show the grid if (ProductViewList.Count == 0) ProductViewList.Add( new ProductView()); grdViewProducts.DataSource = ProductViewList; grdViewProducts.DataBind(); // Assign the Total Record count to hiddenTotalRecords.Value = totalRecordCount.ToString(); // Try to find the sorted column for ( int intRowIndex = 0; intRowIndex < grdViewProducts.Columns.Count; intRowIndex++) { if (strSortExpression == grdViewProducts.Columns[intRowIndex].SortExpression) ((LinkButton)grdViewProducts.HeaderRow.Cells[intRowIndex].Controls[0]) .CssClass = (sortType == SortType.Ascending ? "sortup" : "sortdown" ); } } protected void grdViewProducts_Sorting( object sender, GridViewSortEventArgs e) { string strSortExpression = hiddenSortExpression.Value.Split( "," .ToCharArray())[0]; SortType sortType = (SortType)Enum.Parse( typeof (SortType), hiddenSortExpression.Value.Split( "," .ToCharArray())[1], true ); if (strSortExpression == e.SortExpression) sortType = sortType == SortType.Ascending ? SortType.Descending : SortType.Ascending; else { strSortExpression = e.SortExpression; sortType = SortType.Ascending; } hiddenSortExpression.Value = e.SortExpression + "," + sortType.ToString(); BindGrid(); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| function GetChildGrid(pageId) { // Get the Div var childGridDiv = document.getElementById( "divChildGrid" ); if (childGridDiv) { // If the Child Grid is not fetched, then go and fetch it. var varTotalRecords = document.getElementById( '<%= hiddenTotalRecords.ClientID %>' ).value; var varPageRecordCount = document.getElementById( '<%= hiddenPageRecordCount.ClientID %>' ).value; var varSortExpression = document.getElementById( '<%= hiddenSortExpression.ClientID %>' ).value; if ((pageId > 0) && (parseInt(varTotalRecords) > (parseInt(varPageRecordCount) * (parseInt(pageId) - 1)))) { var url = 'RowsBuilder.aspx?PageId=' + pageId + '&PageRecordsCount=' + varPageRecordCount + '&SortExpression=' + varSortExpression; xmlHttp = createAjaxObject(); if (xmlHttp) { xmlHttp.open( 'get' , url, true ); xmlHttp.onreadystatechange = function () { HandleResponse(pageId); } varPageOnBehind = varStartAJAXPage; xmlHttp.send( null ); } } } } |
The vedio output download the working copy of the source code in C# here and in VB here.
Comments
Post a Comment