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ć.