2011-01-12 4 views
1

Ich habe Filter-Code-Setup auf einem benutzerdefinierten Webpart, aber es ist ein Fehler auf der Website, wenn die Filterung ausgewählt ist, habe ich ein paar mögliche Korrekturen ausprobiert, ohne Erfolg und auf der Suche nach etwas Hilfe was ich vermisse/falsch mache.Wie Filtering in SPGridView funktioniert

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

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

Der Fehler auf der Seite: -

ERROR: SPGridView_FilterCallbackErrorHandler() aufgerufen wurde - Ergebnis = Das Ziel 'ctl00 $ m $ g_f0816b70_5f1d_4c59_9ba2_39401a4d7ea6 $ ctl00 $ gridID' für den Rückruf konnte nicht gefunden werden oder nicht implementiert ICallbackEventHandler ....

Jede Hilfe geschätzt. Vielen Dank.

Antwort

1

die Linie bewegen, wo Sie das Raster-ID es irgendwo zuweisen wird jede Seite zu laden genannt

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

EDIT

Eigentlich müssen Sie den gesamten Code bewegen, die den Steuerbaum erstellt, so dass Es wird jede Seitenladung erstellt. Am besten tun Sie das entweder in OnInit oder in CreateChildControls. Dinge wie

this.Controls.Add(xyz); 
+0

Dank für den Vorschlag, nicht ganz sicher, der beste Weg, um dies hinzuzufügen, wird jede Hilfe/Beratung geschätzt. – CoderMb

0

djeeg ist richtig. Sie müssen sicherstellen, dass alle Ihre Steuerelemente in CreateChildControls geladen sind. Für mich musste ich alle Eigenschaften in den Override laden und so einstellen.

protected override void CreateChildControls() 
{ 

    InitGridView(); 

    InitBoundColumns(); 

    InitDataSource(); 

    ... //other code ellided 

    Controls.Add(_scopingGridView); 

} 

Bei jedem der obigen Verfahren alle der Aufbau für die SPGridView, BoundColumsn und Object Durchführung sind. Hoffe das hilft. Siehe http://www.threewill.com/2010/08/the-great-and-powerful-spgridview/ für einige andere Informationen darüber, wie ich die oben genannten ...