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;

  1. ObjectDataSource odsDataSourceActual = new ObjectDataSource(  
  2. "WebCon.Solutions.ELearning.WebParts.ExampleObjectDataSourceActual2 , WebCon.Solutions.ELearning.WebParts, Culture=neutral, Version=1.0.0.0, PublicKeyToken=c30f1f18c194ceba",  
  3. "GetDataTable");  
  4.                         odsDataSourceActual.TypeName = typeof(WebCon.Solutions.ELearning.WebParts.ExampleObjectDataSourceActual2).AssemblyQualifiedName;  
  5.             odsDataSourceActual.ID = "ExampleSourceActual";  
  6.   
  7.             HttpRequest reqActual = HttpContext.Current.Request;  
  8.             if (reqActual.Form["__CALLBACKID"] == null ||  
  9.               reqActual.Form["__CALLBACKPARAM"] == null ||  
  10.               !reqActual.Form["__CALLBACKID"].EndsWith("ExampleGridActual"))  
  11.             {  
  12.                 if (ViewState["FilterExpression"] != null)  
  13.                     odsDataSourceActual.FilterExpression = (string)ViewState["FilterExpression"];  
  14.             }  
  15.   
  16.             this.Controls.Add(odsDataSourceActual);  
  17.   
  18.             gVActual = new SPGridView();  
  19.             gVActual.ID = "ExampleGridActual";  
  20.             gVActual.AutoGenerateColumns = false;  
  21.             TableItemStyle tis = gVActual.HeaderStyle;  
  22.             tis.ForeColor = System.Drawing.Color.DarkGray;  
  23.   
  24.             HyperLinkField colHyperLink = new HyperLinkField();  
  25.             colHyperLink.DataNavigateUrlFields = "LEA_ID".Split(‘,’);  
  26.             colHyperLink.DataTextField = "Title";  
  27.             colHyperLink.DataNavigateUrlFormatString = SPContext.Current.Web.Url + "/_layouts/WebCon/ELearningTest.aspx?learningID={0}";  
  28.             colHyperLink.HeaderText = "Nazwa";  
  29.             colHyperLink.SortExpression = "Title";  
  30.             gVActual.Columns.Add(colHyperLink);  
  31.   
  32.             BoundField EndDate = new BoundField();  
  33.             EndDate.DataField = "EndDate";  
  34.             EndDate.HeaderText = "Data do";  
  35.             EndDate.SortExpression = "EndDate";  
  36.             gVActual.Columns.Add(EndDate);  
  37.   
  38.             BoundField Points = new BoundField();  
  39.             Points.DataField = "Points";  
  40.             Points.HeaderText = "Uzyskane punkty";  
  41.             Points.SortExpression = "Points";  
  42.             gVActual.Columns.Add(Points);  
  43.   
  44.             BoundField LEA_ID = new BoundField();  
  45.             LEA_ID.DataField = "LEA_ID";  
  46.             LEA_ID.HeaderText = "LEAID";  
  47.             LEA_ID.SortExpression = "LEA_ID";  
  48.             gVActual.Columns.Add(LEA_ID);  
  49.   
  50.             gVActual.Columns[3].Visible = false;  
  51.             gVActual.AllowSorting = true;  
  52.             gVActual.AllowFiltering = true;  
  53.             gVActual.PageSize = 10;  
  54.             gVActual.AllowPaging = true;  
  55.             gVActual.FilterDataFields = "Title, EndDate, Send";  
  56.             gVActual.FilteredDataSourcePropertyName = "FilterExpression";  
  57.             gVActual.FilteredDataSourcePropertyFormat = "{1} = ’{0}’";  
  58.             gVActual.DataSourceID = "ExampleSourceActual";  
  59.             gVActual.EnableViewState = false;  
  60.             gVActual.PageIndexChanging += new GridViewPageEventHandler(gVActual_PageIndexChanging);  
  61.             this.Controls.Add(new LiteralControl("<div id="\"divActual\"">"));  
  62.             this.Controls.Add(gVActual);  
  63.             this.Controls.Add(new LiteralControl("</div>"));  
  64.             gVActual.PagerTemplate = null;  
  65.             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.


Autor wpisu: 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.
# | Liczba komentarzy: 5 | Tagi: ,     


Komentarze:
25 lis 2008 01:45 | Gutek

Obiekt ma, ale problem nie lezy w ObjectDataSource tylko w tym, ze Twoje zdarzenie OnSort, OnFilter jest przekazywane nie do tego SPGridView do ktorego byc powinno.

Tak jak zaznaczylem u siebie, podczas zabawy udalo mi sie spowodowac by dzialaly 2 web party po jednym SPGridView na kazdym, jednakze dopiero wtedy to mi zadzialalo - i to zaznaczam - jak dodalem jednego web parta, zakonczylem edycje strony i ponownie zedytowalem strone dodajac web part.

Wiec, teraz takie pytania:
1) Jaka wersja WSS/MOSS i na czym dokladnie rozwiazanie bylo testowane
2) Jakie patche do WSS/MOSS byly wgrane?

Bo nie chce mi się wieżyć by to bylo spowodowane tym “iz to poprostu dziala” bo na dwoch roznych maszynach, dwa rozne projekty nie poszly swojego czasu.

Dzieki i pozdrawiam

Gutek

25 lis 2008 16:10 | Szymon Bochniak

Ze swej strony dodam, że rzeczywiście jeden projekt na tym poległ. Drugi w pełni działa, powyżej fragment kodu. Środowisko Windows Server 2003/WSS3.0 SP1. Szczegóły postaram się by omówił kolega jak tylko uda mi się go przymusić do odwiedzin tego posta ;)

27 lis 2008 01:30 | Wafloo27

stronka wam się rozjeżdża w IE !

28 lis 2008 20:25 | Gutek

Dwie roznice widze:
1) gVActual.EnableViewState = false; — tego nie ustawialem i nie probowalem ustawic, imho, tez nie powinno miec wplywu, ale kto wie :(
2) Uzywalem pola z menu kontektsowym. Reszta jest taka sama.

Bede mial mozliwosc przetestowania dopiero w srode/czwartek.

Gutek

2 gru 2008 16:26 | Szymon Bochniak

Pozwolę sobie nieco uspokoić reakcję entuzjazmu na ten post ;) A mianowicie pozwoliłem sobie zweryfikować dokładnie twoje posty Gutek na ten temat. A mianowicie powyższy kod nie rozwiązuje problemu, który Ty też miałeś z czyszczeniem filtrowania (problem jest aktualnie przez nas analizowany). Opisuje on skuteczną metodę dodawania wielu SPGridView na jednej stronie/webparcie :) Obawiam się, że temat który chcieliśmy poruszyć nie do końca zgadzał się z tym Czego oczekiwałeś ;)

PS. Wkrótce opiszemy w jaki sposób skutecznie kumulować filtrowanie w SPGridView i daj Boże sposób na obejście problemu z czyszczeniem filtrowania ;)




Twój komentarz:

 (pole wymagane)
 (pole wymagane)

Subskrybuj RSS Tagi
Warto czytać
Wpisy




 

 

© officesystem.pl, powered by: wordpress