开发者

How to get Filtering in SPGridView working

开发者 https://www.devze.com 2023-02-04 07:28 出处:网络
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

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.

The 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"] = "<a target=_blank href=\"" + dispurl + "\">" + item["Title"].ToString() + "</a>";
                                        row["Created"] = item["Created"].ToString();
                                        row["List"] = "<a target=_blank href=\"" + list.DefaultViewUrl + "\">" + list.Title + "</a>";
                                    }
                                }
                            }
                        }
                    }
                }
          开发者_StackOverflow      //Return the completed DataTable
                return dt;
            }

            //Exception to catch any errors
            catch (Exception s)
            {
                return dt;
            }
        }
    }
}

The error on the site:-

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....

Any help appreciated. Thanks.


Move the line where you assign the grid id to somewhere it is called every page load

protected void Page_Load(object sender, EventArgs e) {
    grid.ID = "gridID";
    if (!Page.IsPostBack) {
        BindToGrid();
    }
}

EDIT

Actually you need to move all your code that creates the control tree so that it is built every page load. Preferably do that in either OnInit, or in CreateChildControls. Things like

this.Controls.Add(xyz);


djeeg is right. You need to make sure that all of your controls are loaded in CreateChildControls. For me, I had to load and set all of the properties in the override like so.

protected override void CreateChildControls()
{

     InitGridView();

     InitBoundColumns();

     InitDataSource();

     ... //other code ellided

     Controls.Add(_scopingGridView);

 }

With each of the above methods performing all of the setup for the SPGridView, BoundColumsn and ObjectDataSource respectively. Hope this helps. See http://www.threewill.com/2010/08/the-great-and-powerful-spgridview/ for some other info on how I used the above...

0

精彩评论

暂无评论...
验证码 换一张
取 消