2011-01-12 23 views
1

カスタムWebパーツでフィルタリングを設定していますが、フィルタリングが選択されているときにサイトにエラーがあります。いくつかの修正を試してみました。私が間違っている/間違っていることについて。SPGridViewでフィルタリングを行う方法

コード..

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>"; 
            } 
           } 
          } 
         } 
        } 
       } 
       //Return the completed DataTable 
       return dt; 
      } 

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

サイト上のエラー: -

ERROR:SPGridView_FilterCallbackErrorHandler()と呼ばれていた - 結果=ターゲット 'ctl00 $ M $ g_f0816b70_5f1d_4c59_9ba2_39401a4d7ea6 $ ctl00 $ gridID'コールバックが見つからないか、ICallbackEventHandlerを実装していませんでした....

ありがとう。

答えて

1
実際にあなたがなるようにコントロールツリーを作成し、すべてのコードを移動する必要があり、あなたがどこかにそれがEDIT

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

すべてのページのロードと呼ばれるにグリッドIDを割り当てるラインを移動

それはすべてのページの負荷を構築されます。好ましくは、OnInitまたはCreateChildControlsのいずれかで行います。物語のようなもの

this.Controls.Add(xyz); 
+0

このアドバイスをお寄せいただきありがとうございます。 – CoderMb

0

djeegが正しいです。すべてのコントロールがCreateChildControlsに読み込まれていることを確認する必要があります。私にとっては、オーバーライドのすべてのプロパティをロードして設定する必要がありました。

protected override void CreateChildControls() 
{ 

    InitGridView(); 

    InitBoundColumns(); 

    InitDataSource(); 

    ... //other code ellided 

    Controls.Add(_scopingGridView); 

} 

上記の各方法では、それぞれSPGridView、BoundColumsnおよびObjectDataSourceのすべてのセットアップを実行します。お役に立てれば。上記をどのように使用したかに関するその他の情報については、http://www.threewill.com/2010/08/the-great-and-powerful-spgridview/を参照してください。

関連する問題