niedziela, 23 listopada 2008

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("
"));
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.

Brak komentarzy:

Prześlij komentarz