title: How to get Filtering in SPGridView working
body: <p>I have filtering code setup on a custom webpart, but there is an error on the site when filtering is selected, I've tried a few potential fixes, to no avail and looking for some help on what I might be missing/doing wrong.</p>
  
  <p>The code..</p>
  
  <pre><code>using System;
  using System.Data;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.Web.UI.WebControls.WebParts;
  using Microsoft.SharePoint;
  
  namespace Test.TestWebPart
  {
      public partial class TestWebPartUserControl : UserControl
      {
          //Global variable call
          private SPSite thisSite = SPContext.Current.Site;
          //private SPWebCollection thisWeb;//
          private SPWeb thisWeb = SPContext.Current.Web;
          private DataTable dt;
          private SPListCollection siteLists;
          private DataTableWrapper myDataTable;
  
  
  
          protected void Page_Load(object sender, EventArgs e)
          {
  
              if (!Page.IsPostBack)
              {
                  BindToGrid();
              }
          }
  
          private void BindToGrid()
          {
              dt = new DataTable();
              dt.Columns.Add("Title");
              dt.Columns.Add("Created");
              dt.Columns.Add("List");
              dt = SelectData();
  
              myDataTable = new DataTableWrapper(dt);
              Type t = myDataTable.GetType();
  
  
              ObjectDataSource ds = new ObjectDataSource();
              ds.ID = "myDataSource";
              ds.TypeName = t.AssemblyQualifiedName;
              ds.SelectMethod = "GetTable";
              ds.ObjectCreating += new ObjectDataSourceObjectEventHandler(ds_ObjectCreating);
              this.Controls.Add(ds);
  
              grid.ID = "gridID";
  
  
              //Bind the three columns to the SPGridView
              //HtmlEncode must be false for the links to appear as true html
              BoundField column = new BoundField();
              column.DataField = "Title";
              column.HtmlEncode = false;
              //column.SortExpression = "Title";
              column.HeaderText = "Title";
              grid.Columns.Add(column);
  
              BoundField column1 = new BoundField();
              column1.DataField = "Created";
              column1.HtmlEncode = true;
              //column1.SortExpression = "Created";
              column1.HeaderText = "Created";
              grid.Columns.Add(column1);
  
              BoundField column2 = new BoundField();
              column2.DataField = "List";
              column2.HtmlEncode = false;
              //column2.SortExpression = "List";
              column2.HeaderText = "List";
              grid.Columns.Add(column2);
  
  
              grid.AllowFiltering = true;
              grid.FilterDataFields = "Title,Created,ListName";
              grid.FilteredDataSourcePropertyName = "FilterExpression";
              grid.FilteredDataSourcePropertyFormat = "{1} == '{0}'";
  
  
              //Provide the SPGridview with the DataSource
              grid.DataSourceID = "myDataSource";
              this.Controls.Add(grid);
  
  
  
              //Default Pagination - commented out due to not working
              //grid.PageIndexChanging += new GridViewPageEventHandler(grid_PageIndexChanging);
              //grid.PagerTemplate = null;
  
              //Bind the data to the grid
              grid.DataBind();
  
  
          }
  
          //private void GenerateColumns()
          //{
  
          //}
  
          //Used to deal with the PageIndexChange event
          void grid_PageIndexChanging(object sender, GridViewPageEventArgs e)
          {
              grid.PageIndex = e.NewPageIndex;
              grid.DataBind();
          }
  
          //Used to deal with the ObjectCreated event
          void ds_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
          {
              myDataTable = new DataTableWrapper(dt);
              e.ObjectInstance = myDataTable;
          }
  
          //Pulls the data from lists which will be displayed
          public DataTable SelectData()
          {
              try
              {
                  //Create a new instance of type DataRow
                  DataRow row;
  
                  //Loop through each website in the webcollection
  
                  {
                      //Pull the lists from the site into a list collection
                      siteLists = thisWeb.Lists;
                      //Display only lists the current user has access to
                      siteLists.ListsForCurrentUser = true;
  
                      SPBasePermissions perms = SPBasePermissions.ViewListItems;
  
                      //Loop through each list within the list collection
                      foreach (SPList list in siteLists)
                      {
                          if (list.DoesUserHavePermissions(perms))
                          {
                              //If the list is an announcement list continue otherwise skip
                              if (list.BaseTemplate.ToString() == "Announcements")
                              {
                                  //Exclude the lists stated from those whose data will be collected
                                  if (list.Title.ToString() == "The Buzz" || list.Title.ToString() == "Test 2 list")
                                  {
                                  }
                                  else
                                  {
                                      //Create a item collection for each item within the current list
                                      SPListItemCollection listItem = list.Items;
  
                                      //Loop through each item within the item collection
                                      foreach (SPListItem item in listItem)
                                      {
                                          //Get the url of the current website
                                          string weburl = thisWeb.Url;
                                          //Gets the URL of the current item
                                          string dispurl = item.ContentType.DisplayFormUrl;
                                          dispurl = list.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url;
  
                                          //Joins together the full URL for the current item into a single variable
                                          dispurl = string.Format("{0}/{1}?ID={2}", weburl, dispurl, item.ID);
                                          //Create a new in the datatable as an instance of row
                                          row = dt.Rows.Add();
  
                                          //Put the correct information and links into the correct column
                                          row["Title"] = "&lt;a target=_blank href=\"" + dispurl + "\"&gt;" + item["Title"].ToString() + "&lt;/a&gt;";
                                          row["Created"] = item["Created"].ToString();
                                          row["List"] = "&lt;a target=_blank href=\"" + list.DefaultViewUrl + "\"&gt;" + list.Title + "&lt;/a&gt;";
                                      }
                                  }
                              }
                          }
                      }
                  }
                  //Return the completed DataTable
                  return dt;
              }
  
              //Exception to catch any errors
              catch (Exception s)
              {
                  return dt;
              }
          }
      }
  }
  </code></pre>
  
  <p>The error on the site:-</p>
  
  <p><strong>ERROR: SPGridView_FilterCallbackErrorHandler() was called - result=The target 'ctl00$m$g_f0816b70_5f1d_4c59_9ba2_39401a4d7ea6$ctl00$gridID' for the callback could not be found or did not implement ICallbackEventHandler....</strong></p>
  
  <p>Any help appreciated. Thanks.</p>