Wyświetlanie wielu SPGridView na jednej stronie/WebParcie
Ostatnio, podczas przeglądania stron o tematyce SharePoint’a, natknąłem się na kilka postów o SPGridView. Dotyczyły one problemu sortowania i filtrowania po dodaniu kilku tych kontrolek na jedną stronę lub do jednego WebPart’a. Zdziwiło mnie to, ponieważ w projekcie, który aktualnie kończę, mam WebPart, w którym znajduje się 7 SPGridView, które na dodatek ukrywam za pomocą JavaScript’u. Mam też plik aspx, w którym znajdują się dwie kontrolki tego typu i z nimi również nie mam żadnych problemów. Oczywiście każdy ‚grid’ ma swój własny statyczny obiekt DataSource, z którego dostaje obiekt DataTable.
Przykładowy SPGridView z ObjectDataSource wygląda następująco;
- ObjectDataSource odsDataSourceActual = new ObjectDataSource(
- "WebCon.Solutions.ELearning.WebParts.ExampleObjectDataSourceActual2 , WebCon.Solutions.ELearning.WebParts, Culture=neutral, Version=1.0.0.0, PublicKeyToken=c30f1f18c194ceba",
- "GetDataTable");
- odsDataSourceActual.TypeName = typeof(WebCon.Solutions.ELearning.WebParts.ExampleObjectDataSourceActual2).AssemblyQualifiedName;
- odsDataSourceActual.ID = "ExampleSourceActual";
-
- HttpRequest reqActual = HttpContext.Current.Request;
- if (reqActual.Form["__CALLBACKID"] == null ||
- reqActual.Form["__CALLBACKPARAM"] == null ||
- !reqActual.Form["__CALLBACKID"].EndsWith("ExampleGridActual"))
- {
- if (ViewState["FilterExpression"] != null)
- odsDataSourceActual.FilterExpression = (string)ViewState["FilterExpression"];
- }
-
- this.Controls.Add(odsDataSourceActual);
-
- gVActual = new SPGridView();
- gVActual.ID = "ExampleGridActual";
- gVActual.AutoGenerateColumns = false;
- TableItemStyle tis = gVActual.HeaderStyle;
- tis.ForeColor = System.Drawing.Color.DarkGray;
-
- HyperLinkField colHyperLink = new HyperLinkField();
- colHyperLink.DataNavigateUrlFields = "LEA_ID".Split(‚,’);
- colHyperLink.DataTextField = "Title";
- colHyperLink.DataNavigateUrlFormatString = SPContext.Current.Web.Url + "/_layouts/WebCon/ELearningTest.aspx?learningID={0}";
- colHyperLink.HeaderText = "Nazwa";
- colHyperLink.SortExpression = "Title";
- gVActual.Columns.Add(colHyperLink);
-
- BoundField EndDate = new BoundField();
- EndDate.DataField = "EndDate";
- EndDate.HeaderText = "Data do";
- EndDate.SortExpression = "EndDate";
- gVActual.Columns.Add(EndDate);
-
- BoundField Points = new BoundField();
- Points.DataField = "Points";
- Points.HeaderText = "Uzyskane punkty";
- Points.SortExpression = "Points";
- gVActual.Columns.Add(Points);
-
- BoundField LEA_ID = new BoundField();
- LEA_ID.DataField = "LEA_ID";
- LEA_ID.HeaderText = "LEAID";
- LEA_ID.SortExpression = "LEA_ID";
- gVActual.Columns.Add(LEA_ID);
-
- gVActual.Columns[3].Visible = false;
- gVActual.AllowSorting = true;
- gVActual.AllowFiltering = true;
- gVActual.PageSize = 10;
- gVActual.AllowPaging = true;
- gVActual.FilterDataFields = "Title, EndDate, Send";
- gVActual.FilteredDataSourcePropertyName = "FilterExpression";
- gVActual.FilteredDataSourcePropertyFormat = "{1} = ’{0}’";
- gVActual.DataSourceID = "ExampleSourceActual";
- gVActual.EnableViewState = false;
- gVActual.PageIndexChanging += new GridViewPageEventHandler(gVActual_PageIndexChanging);
- this.Controls.Add(new LiteralControl("<div id=""divActual"">"));
- this.Controls.Add(gVActual);
- this.Controls.Add(new LiteralControl("</div>"));
- gVActual.PagerTemplate = null;
- gVActual.DataBind();
ObjectDataSource odsDataSourceActual = new ObjectDataSource(
"WebCon.Solutions.ELearning.WebParts.ExampleObjectDataSourceActual2 , WebCon.Solutions.ELearning.WebParts, Culture=neutral, Version=1.0.0.0, PublicKeyToken=c30f1f18c194ceba",
"GetDataTable");
odsDataSourceActual.TypeName = typeof(WebCon.Solutions.ELearning.WebParts.ExampleObjectDataSourceActual2).AssemblyQualifiedName;
odsDataSourceActual.ID = "ExampleSourceActual";
HttpRequest reqActual = HttpContext.Current.Request;
if (reqActual.Form["__CALLBACKID"] == null ||
reqActual.Form["__CALLBACKPARAM"] == null ||
!reqActual.Form["__CALLBACKID"].EndsWith("ExampleGridActual"))
{
if (ViewState["FilterExpression"] != null)
odsDataSourceActual.FilterExpression = (string)ViewState["FilterExpression"];
}
this.Controls.Add(odsDataSourceActual);
gVActual = new SPGridView();
gVActual.ID = "ExampleGridActual";
gVActual.AutoGenerateColumns = false;
TableItemStyle tis = gVActual.HeaderStyle;
tis.ForeColor = System.Drawing.Color.DarkGray;
HyperLinkField colHyperLink = new HyperLinkField();
colHyperLink.DataNavigateUrlFields = "LEA_ID".Split(',');
colHyperLink.DataTextField = "Title";
colHyperLink.DataNavigateUrlFormatString = SPContext.Current.Web.Url + "/_layouts/WebCon/ELearningTest.aspx?learningID={0}";
colHyperLink.HeaderText = "Nazwa";
colHyperLink.SortExpression = "Title";
gVActual.Columns.Add(colHyperLink);
BoundField EndDate = new BoundField();
EndDate.DataField = "EndDate";
EndDate.HeaderText = "Data do";
EndDate.SortExpression = "EndDate";
gVActual.Columns.Add(EndDate);
BoundField Points = new BoundField();
Points.DataField = "Points";
Points.HeaderText = "Uzyskane punkty";
Points.SortExpression = "Points";
gVActual.Columns.Add(Points);
BoundField LEA_ID = new BoundField();
LEA_ID.DataField = "LEA_ID";
LEA_ID.HeaderText = "LEAID";
LEA_ID.SortExpression = "LEA_ID";
gVActual.Columns.Add(LEA_ID);
gVActual.Columns[3].Visible = false;
gVActual.AllowSorting = true;
gVActual.AllowFiltering = true;
gVActual.PageSize = 10;
gVActual.AllowPaging = true;
gVActual.FilterDataFields = "Title, EndDate, Send";
gVActual.FilteredDataSourcePropertyName = "FilterExpression";
gVActual.FilteredDataSourcePropertyFormat = "{1} = '{0}'";
gVActual.DataSourceID = "ExampleSourceActual";
gVActual.EnableViewState = false;
gVActual.PageIndexChanging += new GridViewPageEventHandler(gVActual_PageIndexChanging);
this.Controls.Add(new LiteralControl("")); this.Controls.Add(gVActual); this.Controls.Add(new LiteralControl("
"));
gVActual.PagerTemplate = null;
gVActual.DataBind();
Sam ObjectDataSource ogranicza sie do kilku operacji i zwrócenia DataTable, więc nie ma sensu wrzucać jego kodu, ale oczywiscie przypominam, że każdy grid ma własny ODS. Ukrywanie polega na ustawianiu div’a zawierającego naszego ‚grida’ na display: none, przez JavaScript’ową funkcję.
W ten sposób na stronie znajduje się 7 kontrolek SPGridView i we wszystkich działa zarówno sortowanie, jak i filtrowanie.
|
|
Tomasz Rabiński - więcej informacji
Firma WebCon Solutions zajmuje się wdrożeniami, oraz dedykowanymi rozwiązaniami dla oprogramowania Windows SharePoint Services oraz Microsoft Office SharePoint Server. |
|