Wie man das Filtern in SPGridView arbeiten
Habe ich die Filterung code-setup auf ein benutzerdefiniertes webpart, aber es ist ein Fehler auf der Website, wenn die Filterung aktiviert ist, habe ich versucht, ein paar mögliche Lösungen, ohne Erfolg und auf der Suche nach etwas Hilfe, auf was ich möglicherweise fehlen/falsch.
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;
}
}
}
}
Den Fehler auf der site:-
FEHLER: SPGridView_FilterCallbackErrorHandler() aufgerufen wurde - das Ergebnis=Das Ziel 'ctl00$m$g_f0816b70_5f1d_4c59_9ba2_39401a4d7ea6$ctl00$gridid etwa' für den Rückruf konnte nicht gefunden oder nicht implementiert ICallbackEventHandler....
Jede Hilfe dankbar. Danke.
InformationsquelleAutor CoderMb | 2011-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verschieben Sie die Linie, wo ordnen Sie die raster-id, um Sie irgendwo aufgerufen wird jedes laden der Seite
BEARBEITEN
Tatsächlich, die Sie benötigen, um alle code, erstellt die control-Struktur, so dass es gebaut ist, jede Seite zu laden. Am besten in OnInit -, oder in CreateChildControls. Dinge wie
InformationsquelleAutor djeeg
djeeg richtig ist. Sie müssen sicherstellen, dass alle Steuerelemente geladen werden, in CreateChildControls. Für mich, die ich hatte geladen und alle Eigenschaften in den override-wie so.
Mit jedem der oben genannten Methoden ausführen aller setup für das SPGridView, BoundColumsn ObjectDataSource-bzw. Hoffe, das hilft. Sehen http://www.threewill.com/2010/08/the-great-and-powerful-spgridview/ für einige andere Informationen auf, wie ich den oben...
InformationsquelleAutor Pete Skelly