Cross-Site Lookup Field With PickerDialog

O co chodzi? Pierwsza część nazwy jest chyba zrozumiała, zwykłe pole lookup, które umożliwia pobieranie danych z listy umiejscowionej na innej stronie. Tutaj należą się wyjaśnienia. Jako stronę mam namyśli SPSite, nie SPWeb ani SPWebApplication. W jednym SPSite może być wiele SPWeb, zaś SPSite należy do jakiegoś SPWebApplication. Więc cross-site to nie lookup po wielu SPSite, tylko lookup po wszystkich SPWeb należących do danego SPSite. Nie zależnie od tego czy SPWeb zawiera pod-stronę czy jej nie zawiera.

No dobrze, ale samo cross-site to nie taka nowość, jednak PickerDialog, to już nowość :) Na pewno korzystaliście z pola People And Groups, umożliwiającego przeszukiwania osób w danym SPWeb. To wyobraźcie sobie takie samo okno, ale z możliwością wybierania elementów z listy :)

Zdecydowałem się stworzyć ten przykład, gdyż w sieci na ten temat nie ma wielu artykułów, tak naprawdę to nie ma żadnego wartościowego, te artykułu na które ja natrafiłem można znaleźć poniżej:

·         .Net Tips: Customizing EntityEditorWithPicker

·         Build your own SharePoint 2007 Picker Dialog

Osobiście polecam zapoznania się z tymi artykułami, są krótkie ale i dość treściwe.

No więc, jak już mniej więcej wiecie o co chodzi. To wygląda to tak:

Samo tworzenie takiego pola, nie jest ciężkie, trzeba podać tylko kilka parametrów:

A jego wygląd na stronie edycji elementu też zbytnio się nie różni od pola People And Groups:

Oczywiście, użytkownik nie tylko może przeszukiwać po wartości Imię, ale także w zależności od wartości stworzonego pola, także po innych wartościach:

No dobrze, to tyle prezentacji pola, pora przejść do konkretów.

Chciałem dokładnie opisać sposób tworzenia takiego pola, jednak po tym jak zakończyłem kod stwierdziłem iż samo opisanie tego spowoduje stworzenie kolejnego 30/40 stronnicowego wpisu. Dlatego też zmieniłem zdanie, zamiast dokładnego opisywania, stworzyłem przykład z (sądzę) bardzo dokładnymi opisami, które posłużą wam w kwestii wyjaśnienia pewnych zachować kontrolki, oraz sposobu jej tworzenia.

To co jest najważniejsze przy tworzeniu pola z wykorzystaniem PickerDialog, to przeciążenie trzech klas:

·         EntityEditorWithPicker – Klasa odpowiedzialna za pole wyszukiwania oraz pole edycji wartości naszego lookup – chodzi o ten prosty input. To co tu jest bardzo ważne i należy to zrobić to należy przeciążyć metodę OnInit, w której należy ustawić własność bazową PickerDialogType na nasze okno dialogowe, reszta metod i wartość nie jest konieczna oraz przymusowa;

·         PickerDialog – Klasa odpowiedzialna za wyświetlenie okna dialogowego i jego obsługę. W klasie najważniejszy jest konstruktor (który może być bezparametrowy). To co jest tutaj ważne to, aby w konstruktorze lub w metodzie OnLoad tworzyć kolumny w oknie dialogowym, które będą służyć wyświetlaniu wyników, oraz by nasz konstruktor wywoływał konstruktor bazowy z trzema parametrami:

o   Nową klasą dziedziczącą po SimpleQueryControls;

o   Klasą odpowiedzialną za wyświetlanie wyników (domyślnie można zastosować TableResultControl);

o   Nową klasą dziedziczącą po EntityEditorWithPicker.

·         SimpleQueryControl – Przeciążona klasa musi udostępniać metodę umożliwiającą przeszukiwanie danych po ciągu znaków wprowadzonym w oknie dialogowym. W tym celu ważne jest przeciążenie metody IssueQuery.

I to tak w skrócie :) Naprawdę starałem się zawrzeć jak najdokładniejsze komentarze w kodzie byście mogli z samego kodu wyciągnąć więcej niż na z samego opisu w postcie.

Dlatego zapraszam do korzystania (sposób instalacji w pliku Readme.txt).

Cały kod można pobrać z stąd: Pole Cross-Site Lookup Field With PickerDialog.

Jeżeli macie jakiekolwiek pytania, lub coś jest niejasnego w komentarzach do kodu, stwórzcie komentarz do postu, postaram się na wszystkie pytania odpowiedzieć.

Opublikowane 15 września 08 01:18 przez Gutek

Komentarze:

# blbu said on września 15, 2008 17:00:

Stworzylem kontrolke, ale wycialem z niej cala funkcjonalnosc zwiazana z konfigurowaniem, tzn. potrzebuje ja tylko dla jednej listy i jednego pola. Nie dodalem plikow .aspx oraz edytora fielda.

Wszystko działa oprocz zapisywania lookup'a... Wiesz moze gdzie lezy problem i jak go ominac? :)

# Gutek said on września 15, 2008 18:09:

@blbu

Co masz na mysli mowiac "zapisywanie lookup" w sensie dane nie widnieja na liscie po tym jak wybierzesz wartosc? czy to ze lookup traci swoja konfiguracje (odwolanie do jednej listy i jednego pola)? Czy to iz nie mozna stworzyc lookup za pomoca create column?

Gutek

# blbu said on września 15, 2008 18:27:

dane nie widnieja na liscie po tym jak wybiore wartosc.

# blbu said on września 15, 2008 18:31:

Probowalem tez dodac id listy i id pola powiazanego do konstruktora mojej klasy dziedziczacej po SPFieldLookup ale nie pomoglo...

# Gutek said on września 15, 2008 18:52:

@blbu

Chyba najprosciej bedzie jak spakujesz to swoje pole i przeslesz mi je: jakubDOTgutkowskiATgmailDOTcom

zmianiec slowa na znaki. Bo tak to ciezko mi jest cokolwiek powiedzieciec. Mam kilka przypuszczen jednak lepiej to przeniesc na maila niz tworzyc 100 komentarzy :)

Gutek

Gutek

# Gutek said on września 16, 2008 13:48:

To tak na wszeki wypadek. Zrobilismy wczoraj analize pola, i wyszlo na to iz edytor pola jest potrzebny by ustawic wartosci lookup, w przeciwnym wypadku wartosc nie bedzie zapisywana. Dlaczego, ciezko powiedziec. BaseFieldControl w trakcie ladowania wywoluje metody get i set na Value i w tym konkretnym przypadku metoda set nigdy nie byla wywolana.

Wiec, ku przestrodze, warto stworzyc wlasny edytor nawet jezeli ma on nie zawierac zadnych kontrolek i tam inicjowac swoje pola! :)

Gutek

# woro said on września 16, 2008 14:22:

Polecam  to

http://cglessner.blogspot.com/2008/07/lookup-field-with-picker.html

Wraz z kodem na CODEPLEX

http://www.codeplex.com/iLoveSharePoint/Release/ProjectReleases.aspx?ReleaseId=15381

Sam sie troche namordowałem z tym :|

Czy tego MOSS'a nie mozna było jakos po ludzku udokumentować ;P a nie szukac wszystkiego po blogach ;)  kto to widzial ;) :P

# Gutek said on września 16, 2008 15:36:

@woro

Bawilem sie tym, ma duzo bledow :( nie waliduje sie i tam jeszcze pare rzeczy wylapalem (nie spisalem ich ale byly wkurzajace jak np.: przeszukiwanie tylko po glownym kontenerze a nie zaglebianie sie w podfoldery, mimo iz w PickerDialog przeszukuje podfoldery).

ale fajny bajer ma z kodem do PowerShell, fajnie iz podmienia on Lookupy na to jego pole.

# marcinmigdal@wp.pl said on września 19, 2008 13:28:

Witam.

Czy bedzie Pan mogl odpisac na miala na weekendzie?

Modyfikuje Pana przyklad i mam kilka pytan

Z powazaniem

Marcin Migdal

marcinmigdal@wp.pl

# Gutek said on września 19, 2008 17:08:

@Marcin

Jasne, wysalem Ci juz maila

Gutek

# .neting in the free world said on listopada 12, 2008 19:38:

This control has been created for the MS Forum post request: Any experiences to share regarding custom

# .neting in the free world said on listopada 28, 2008 12:27:

Numero UNO: Mamy listę klientów, którzy pochodzą z różnych krajów i miast. Chcielibyśmy by miasto było

Komentarze anonimowe wyłączone