2011-01-12 50 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

移動,你的網格ID分配到某個地方,這被稱爲每次頁面加載

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

編輯

其實你需要移動所有的代碼創建控件樹以使該行它是建立在每一頁的負載。最好在OnInit或CreateChildControls中執行。像

this.Controls.Add(xyz); 
+0

感謝您的建議,不完全確定最好的方式來添加此,任何幫助/建議表示讚賞。 – CoderMb 2011-01-17 14:49:12

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/關於我如何使用上述的其他信息...