Extending CQWP with Toolpart- Adding functionality like PageFilter, Pagination - Part 2

This is continuation of earlier post.

CQWP does not have the PageFilter and Pagination functionatilies. By extendign the CQWP, It can be achieved through the XSLT. Pagination is very often used feature for the content displaying webpart.

Pagination

We saw how can we use "ProcessDataDelegate" in the earlier one. By using the same functiontionality we have to achieve the pagination and it should be compatible with XSLT.  ProcessDataDelegate pass resultset of CQWP as the DataTable.

1) Add a column "No" in to DataTable and assign the number for earch row.

2) By using the RowFilter we can filter the row from the starting number to end number what we want. Below is the logic to achieve this.

 int currentPage = 1;
 this.pagesCount = (int)Math.Ceiling((double)dt.Rows.Count / this.ItemsPerPage);

 int startItemNumber = (currentPage - 1) * this.ItemsPerPage;

 int endItemNumber = startItemNumber + (this.ItemsPerPage - 1);
 dt.Columns.Add("Number", typeof(int));

 for (int i = 0; i < dt.Rows.Count; i++)
{

dt.Rows[i]["Number"] = i;

}

dt.DefaultView.RowFilter = String.Format(CultureInfo.CurrentCulture, "Number >= {0} AND Number <= {1}", startItemNumber, endItemNumber);

 dt = dt.DefaultView.ToTable();

 return dt;

 Above logic will return the filtered DataTable

3) How to display in XSLTBy using ModifyXsltArgumentList method we have to add one more parameter
 "argList.AddParameter("PaginationString", string.Empty, pagingHTML)"
4) we have declear a string varibale pagingHTML and coin the HTML to display the pages 
 i.e By using  "builderHtml.Append("<a href=\"#\">" + paginationPrevious + "</a>");"
5) After it should be passed to xslt parameter as mentioned above.

PageFilter

PageFilter functionality will be used when you are provisioning a page with particular field and based on the field value CQWP should filter the data. Again by extending the ProcessDataDelegate, we can achieve this.

1) Add to dropdown into Editor webpart

2)  Display  the current page content type field in first dropdown display, and current site fields in next dropdown

3) Bring the values in to DataProcessing delegate

4) Fetch the value like below

                SPField sourceField = SPContext.Current.Item.Fields.GetFieldByInternalName(this.PageFilterField);
                SPField targetField = SPContext.Current.Site.RootWeb.Fields.GetFieldByInternalName(this.TargetFilterField);

5) Compage the value  and filter it from DataTable.

Happy coding..