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.