Tuesday, April 8, 2008

ObjectDataSource : Manually controlling the sorting expression.

By default the GenWise ASP.NET Templates uses the object datasource SortParamterName. When that property is used , the objectdatasource will manipulate internally the sort expression (change to asc , desc) .

  269     ObjectDataSource runat="server" ID="ObjectDataSource1" TypeName="BOLayer.CustomerFactory"
  270                 SelectCountMethod="Count" EnablePaging="True" UpdateMethod="Save" DeleteMethod="Delete"
  271                 SortParameterName="pSortExpression" MaximumRowsParameterName="pMaxResult" StartRowIndexParameterName="pFirstResult"
  272                 SelectMethod="GetAll">
  273                 
  274                     Parameter Name="pSortExpression">Parameter>
  275                     Parameter Name="pCriteria">Parameter>
  276                 
  277                 
  278                     Parameter Name="CustomerID">Parameter>
  279                 
  280             ObjectDataSource>


For more advanced sorting scenarios you might want to manually control what's passed to the pSortExpression method parameter. This can be done in the following way :

Subscribe to the ObjectDataSource Selecting method (genwise does that automatically)
   44 ObjectDataSource1.Selecting += new ObjectDataSourceSelectingEventHandler(ObjectDataSource1_Selecting);



  253    protected void ObjectDataSource1_Selecting(object pSender, ObjectDataSourceSelectingEventArgs pEventArgs)
  254         {
  255             if (pEventArgs.ExecutingSelectCount)
  256                 pEventArgs.InputParameters.Remove("pSortExpression");
  257             else
  258                 pEventArgs.InputParameters["pSortExpression"] = _newSortExpression;
  259 
  260             pEventArgs.InputParameters["pCriteria"] = Browse1_GetCriteria();
  261         }

Where does _newSortExpression come from ?


  198         string _newSortExpression = null;
  199         protected void Browse1_Sorting(object pSender, GridViewSortEventArgs pEventArgs)
  200         {
  201             // Calls this method to adapt the sort syntax (required for Composite sorting).
  202             _newSortExpression = WebUtils.SortExpressionTransformer(pEventArgs);
  203             pEventArgs.Cancel = true;
  204         }


SortExpression Tranformer takes the ObjectDataSource parameters and manipulates them to make them compatible with the GenWise Factories sorting syntax.

Below is the code of this method:

   63   public static string SortExpressionTransformer(GridViewSortEventArgs pEventArgs)
   64     {
   65         if (pEventArgs == null) throw new ArgumentNullException("pEventArgs");
   66 
   67         if (pEventArgs.SortDirection == SortDirection.Ascending)
   68         {
   69             return pEventArgs.SortExpression;
   70         }
   71 
   72         string newSortExpression = pEventArgs.SortExpression;
   73         string DESC = " DESC";
   74 
   75         if (pEventArgs.SortDirection == SortDirection.Descending)
   76         {
   77             if (pEventArgs.SortExpression.Contains(","))
   78             {
   79                 // Case : We have a composite sorting ( Field1,Field2) 
   80                 newSortExpression = string.Empty;
   81                 string[] sortParts = pEventArgs.SortExpression.Split(',');
   82                 for (int i = 0; i <> 
   83                 {
   84                     string sortPart = sortParts[i];
   85 
   86                     int sortDirectionIndex = sortPart.IndexOf(DESC);
   87                     bool isDescending = (sortDirectionIndex > -1);
   88 
   89                     string property = sortPart;
   90                     if (isDescending)
   91                     {
   92                         // sta : udpate templates.
   93                         //property = sortPart.Substring(0, (sortPart.Length - sortDirectionIndex + 1));
   94                         property = sortPart.Substring(0, (sortPart.Length - sortDirectionIndex + 1 + DESC.Length));
   95                     }
   96 
   97                     if (i > 0) newSortExpression += ",";
   98                     newSortExpression += property;
   99 
  100                     // Only add the DESC to all except the last (Last one will be controlled automatically by the object datasource.
  101                     if (!isDescending)
  102                     {
  103                         if (i < (sortParts.Length - 1))
  104                             newSortExpression +=  DESC ;
  105                     }
  106                 }
  107                 pEventArgs.SortExpression = newSortExpression;
  108             }
  109         }
  110         return newSortExpression;
  111     }

1 comment:

Anonymous said...

Nice post and this post helped me alot in my college assignement. Thanks you as your information.