Tuesday, May 22, 2012

Binding objectdatasource to SPGridView for Sorting


Today I have a simple requirement, to achieve filtering and sorting on a simple grid.
Asp.Net GridView do not have an option to filter by default but where as SPGridView provides as part of the control.
I have simple method, that will form the data into DataTable which will be set as datasource to SPGridView as shown in below code.

<SharePoint:SPGridView runat="server" ID="reportsList" AutoGenerateColumns="false"PageSize="1" AllowPaging="false"
AllowSorting="true"  AllowFiltering="false" FilterDataFields="Col1,Col2,Col3,Col4" >
        <asp:TemplateField HeaderText="Col1" SortExpression="Col1">
                <asp:HyperLink ID="Col1Link" runat="server" Text='<%# Eval("Col1") %>'NavigateUrl= '<%# Eval("Col5") %>'   />
            <asp:TemplateField HeaderText="Col2" SortExpression="Col2">
                <asp:HyperLink ID="TabLink" runat="server" Text='<%# Eval("Col2") %>'NavigateUrl= '<%# Eval("Col6") %>'  />
        <SharePoint:SPBoundField HeaderText="Col3" SortExpression="Col3" DataField="Col3" />
        <SharePoint:SPBoundField HeaderText="Col4" SortExpression="Col4" DataField="Col4" />
    <EmptyDataTemplate>   No data.</EmptyDataTemplate>

above markup is also an example for binding hyperlink fields in spgridview.

protected override void CreateChildControls()
            using (SPSite site = new SPSite(SPContext.Current.Site.Url))
                using (SPWeb web = site.OpenWeb())
                    // bind the datasource to grid
                    reportsList.DataSource = GetMyDataTable();
So easy and simple to see the grid populated with data on the page, but when I choose to sort a column I get the below error .
The GridView 'GridViewID' fired event Sorting which wasn't handled
Googling around I found that property, DataSourceID need to set instead of setting DataSource. Not sure why.
So now I have to rewrite the code and bind some type of datasource(objectdatasource/SPdatasources/…/).
As we know, ObjectDataSource is simple and easy I started with it and then lately realized that I have to create objects, I mean new type that will be used by ObjectDataSource as suggested by all other blogs.
But I do not want to write extra code but directly bind the existing datatable as objectdatasource for which blogs suggest to create type and write a method that will convert it to datatable which seem to be round way for me.
So I tried the below code and able to achieve sorting without a new Type/object definition. Still i could not get filtering work..at least it did not throw any error in log or on page.

//populate the datasource
                    ObjectDataSource  reportsDataSource = new ObjectDataSource();
                    reportsDataSource.ID = "reportsDataSource";
                    reportsDataSource.SelectMethod = "GetMyDataTable";
                    reportsDataSource.TypeName = this.GetType().AssemblyQualifiedName;
                    // bind the datasource to grid
                    reportsList.DataSourceID = "MyDataSource";//  = 



  1. Hello ,
    when i tried to bing metadata column to

    like this there is problem in the data. as metadata column data will look like
    "Amplitude Systemes|4c36ab9d-ba52-40ab-8387-aeb14ffbe1df"
    it will appended with a GUID number.. when i bind the data.. that appended GUID is also showing up..
    how to resolve this? how can i bind metadata column data binding


    1. If GUID is not being used just trim it while adding the metadata value to the datarow of table before binding.