Ajax Webpart displays Webservice data
In this post I want to show how to create an Ajax Webpart, which receives its data from a Webservice – and until the data arrived – shows a status bar.
As base for the Webpart, I took the one from Mark Collins and his great article http://sharethispoint.com/archive/2006/11/15/Build-web-parts-with-ajax.aspx.
The approach is to render the Webpart with only a
The original version from Mark Collins comes without server side controls. I created the
The basic stays the same. Long running operations are moved from your normal Webpart to the RaiseCallbackEvent method.
public
string GetCallbackResult()
{
return
this._AjaxData;
}
public
void RaiseCallbackEvent(string eventArgument)
{
this._AjaxData = CalculateContent();
}
The content returned by the CalculateContent Method is a simple string, which the clients renders later into the
string CalculateContent()
{
string returnString = string.Empty;
try
{
TextWriter tw = new
StringWriter();
HtmlTextWriter _TxtWriter = new
HtmlTextWriter(tw);
_Grid = new
SPGridView();
_Grid.DataSource = GetGridDataSource();
// catch if the grid datasource is empty
if (_DS == null)
{
return
" no data received";
}
…
_Grid.DataBind();
_Grid.RenderControl(_TxtWriter);
returnString = _TxtWriter.InnerWriter.ToString();
}
catch (Exception ex)
{
_ErrorText += "Error in CalculateContent:\r\n:" + ex.ToString() + "\r\n";
returnString = _ErrorText;
}
return returnString;
}
This approach has a big disadvantage. You cannot use sorting, paging and filtering in the SPGridView, because it is created on the client side. You can use grouping, though. So what can we do about sorting and paging?
- Sorting can be realized with a Webpart property, which takes the sort field an order, and sorts the underlying DataSet/DataView.
private
if (!String.IsNullOrEmpty(_SortString))
{
string[] sortArray = _SortString.Split(‘;’);
if (sortArray.Length == 2)
{
SortExpression = sortArray[0];
SortDirection = sortArray[1];
if (DataSetContainsField(_DS, SortExpression))
{
_DS.Tables[0].DefaultView.Sort = SortExpression + " " + SortDirection;
}
}
}
- Filtering is also realized with a Webpart property, and modifying the DataSet/DataView
if (!String.IsNullOrEmpty(_FilterString) && _FilterString.Contains("="))
{
string filterColumnName = _FilterString.Substring(0, _FilterString.IndexOf(‘=’));
// catch typos in the filter
if (DataSetContainsField(_DS, filterColumnName))
{
_DS.Tables[0].DefaultView.RowFilter = _FilterString;
}
}
- Paging: As soon, as I find a better solution, I will tell you about it J
Download the code here.