Tuesday, May 22, 2012

Binding objectdatasource to SPGridView for Sorting

Share/Save/Bookmark

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" >
    <Columns>
        <asp:TemplateField HeaderText="Col1" SortExpression="Col1">
            <ItemTemplate>
                <asp:HyperLink ID="Col1Link" runat="server" Text='<%# Eval("Col1") %>'NavigateUrl= '<%# Eval("Col5") %>'   />
            </ItemTemplate>
        </asp:TemplateField>
            <asp:TemplateField HeaderText="Col2" SortExpression="Col2">
            <ItemTemplate>
                <asp:HyperLink ID="TabLink" runat="server" Text='<%# Eval("Col2") %>'NavigateUrl= '<%# Eval("Col6") %>'  />
            </ItemTemplate>
        </asp:TemplateField>
                                   
        <SharePoint:SPBoundField HeaderText="Col3" SortExpression="Col3" DataField="Col3" />
        <SharePoint:SPBoundField HeaderText="Col4" SortExpression="Col4" DataField="Col4" />
    </Columns>
    <EmptyDataTemplate>   No data.</EmptyDataTemplate>
</SharePoint:SPGridView>


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

protected override void CreateChildControls()
        {
            base.CreateChildControls();
            using (SPSite site = new SPSite(SPContext.Current.Site.Url))
            {
                using (SPWeb web = site.OpenWeb())
                {
                  
                    // bind the datasource to grid
                    reportsList.DataSource = GetMyDataTable();
                    reportsList.DataBind();
                  
                }
            }
           
        }
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;
                    this.Controls.Add(reportsDataSource);
                    
                    // bind the datasource to grid
                    reportsList.DataSourceID = "MyDataSource";//  = 
                    reportsList.DataBind();


 Subscribe

2 comments:

  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

    Regards
    Guru

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

      Delete