Scenariusza biznesowego:
Realizacji całego przedsiębiorstwa MOSS dla produkcji firmy z 30+ miejsc i kilka kilkanaście działów firmy.
Celem firmy:
Pomimo wielu grup biznesowych (działy, lokalizacje, itp), Niektóre dane powinny zostać utrzymane na poziomie światowym. Na przykład, autorytatywne główny wykaz wszystkich fizycznej lokalizacji firmy (np.. zakłady produkcyjne, lokalizacji magazynowych, biura sprzedaży) powinny zostać utrzymane w spokojnej.
Problem techniczny:
Taksonomia przedsiębiorstwa został wdrożony przy użyciu wielu zbiorów witryn. Chcielibyśmy stworzyć listy autorytatywny fizycznej lokalizacji w pewien zwyczaj lista WSS. Następnie, Kiedy musieliśmy się kolumna typ zawartości (lub kolumna dodawane do biblioteki listy lub doc) że zawarte atrakcje dla turystów, tworzymy z kolumna przy użyciu wyszukiwania"" Typ danych i wskaż ten główny wykaz.
Niestety, typy danych wyszukiwania musi uzyskać dostęp do listy źródła "lokalnie" co oznacza, że naszą listę autorytatywnych nie może obejmować zbiory witryn.
Rozwiązanie techniczne:
Wdrożenie nowego typu danych niestandardowych realizowane na podstawie SPField i reprezentowane jako DropDownList w interfejsie użytkownika, którego listą pozycji wypełnić z głównej listy WSS.
Stworzyliśmy nową kolekcję witrynę o nazwie "http://localhost/EnterpriseData". Tam, stworzyliśmy listę niestandardową o nazwie "Atrakcje dla turystów". Ta lista tylko używa standardowych tytułu"" pole zawiera wykaz rzeczywistej lokalizacji firmy.
Jeden wynika kilka dyskretnych kroków, aby utworzyć typ danych niestandardowych w WSS. Są one:
- Definiowanie klasy, która dziedziczy z SPField (jeden może dziedziczyć z innych dziedzin, w razie potrzeby).
Oto kod do tego:
publiczne Klasa XYZZYCorporateLocationField : SPFieldText
{
publiczne XYZZYCorporateLocationField
(SPFieldCollection pola, ciąg atrybut typeName, ciąg displayName)
: podstawy(pola, atrybut typeName, displayName) { }
publiczne XYZZYCorporateLocationField
(SPFieldCollection pola, ciąg displayName)
: podstawy(pola, displayName) { }
publiczne zastępowanie BaseFieldControl FieldRenderingControl
{
Pobierz
{
BaseFieldControl Sterowanie = Nowy XYZZYCorporateLocationFieldControl();
kontroli. Nazwa_pola = to.InternalName;
Powrót kontrola;
} //Pobierz
} // fieldrenderingcontrol
publiczne zastępowanie ciąg GetValidatedString(obiekt wartość)
{
Jeśli (to.Wymagane || wartość. ToString().Równa się(Ciąg.Pusty))
{
rzut Nowy SPFieldValidationException ("Nie przypisano w departamencie.");
}
Powrót podstawy.GetValidatedString(wartość);
} // getvalidatedstring
} // XYZZYCorporateLocation
- Określenie innej klasy, która dziedziczy pola podstawy kontroli, jak w:
publiczne Klasa XYZZYCorporateLocationFieldControl : BaseFieldControl
{
chronione DropDownList XYZZYCorporateLocationSelector;
chronione zastępowanie ciąg DefaultTemplateName
{
Pobierz
{
Powrót "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName
publiczne zastępowanie obiekt Wartość
{
Pobierz
{
EnsureChildControls();
Powrót to.XYZZYCorporateLocationSelector. SelectedValue;
} // Pobierz
zestaw
{
EnsureChildControls();
to.XYZZYCorporateLocationSelector.SelectedValue = (ciąg)to.ItemFieldValue;
} // zestaw
} // zastąpić obiekt wartość
chronione zastępowanie nieważne CreateChildControls()
{
Jeśli (to.Dziedzinie == pusty || to.ControlMode == SPControlMode.Wyświetlacz)
Powrót;
podstawy.CreateChildControls();
to.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer ustawiony.("XYZZYCorporateLocationSelector");
Jeśli (to.XYZZYCorporateLocationSelector == pusty)
rzut Nowy Wyjątek("BŁĄD: Nie można załadować. Pliku ASCX!");
Jeśli (!to.IsPostBack strony.)
{
przy użyciu (SPSite Strona = Nowy SPSite("http://localhost/enterprisedata"))
{
przy użyciu (Sieci Web programu SharePoint Web = site. OpenWeb())
{
SPList currentList = www. Wyświetla listę["Atrakcje dla turystów"];
foreach (SPItem XYZZYCorporateLocation w currentList.Items)
{
Jeśli (XYZZYCorporateLocation["Tytuł"] == pusty) w dalszym ciągu;
ciąg theTitle;
theTitle = XYZZYCorporateLocation["Tytuł"].ToString();
to.XYZZYCorporateLocationSelector.Items.Add
(Nowy ListItem(theTitle, theTitle));
} // foreach
} // za pomocą spweb web = site.openweb()
} // za pomocą Strona spsite = new spsite("http://localhost/enterprisedata")
} // Jeśli nie postback
} // CreateChildControls
} // XYZZYCorporateLocationFieldControl
Powyższy kod w zasadzie implementuje logiki dla wypełniania DropDownList wartościami z listy niestandardowe WSS, znajdujące się w http://localhost/enterprisedata i o nazwie "korporacyjnych działów".
Ja zdefiniowane w obu klasach w .cs pojedynczego pliku, Skompilowałem go i umieścić go w pamięci podręcznej GAC (silne wymagane, Oczywiście).
-
Wdrożenie szablonu kontroli (.ascx) jak pokazano:
<%@ Kontroli Język= "C#" Dziedziczy="Microsoft.SharePoint.Portal.serveradmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Wersja = 12.0.0.0, Culture = neutral,TokenKluczaPublicznego zespołu = 71e9bce111e9429c" compilationMode= "Zawsze" %>
<%@ Rejestr TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Montaż="Microsoft.SharePoint, Wersja = 12.0.0.0, Kultura = neutral, TokenKluczaPublicznego zespołu = 71e9bce111e9429c" %> <%@ Rejestr TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Montaż="Microsoft.SharePoint, Wersja = 12.0.0.0, Kultura = neutral, TokenKluczaPublicznego zespołu = 71e9bce111e9429c" %>
<SharePoint:Wartość parametru RenderingTemplate IDENTYFIKATOR= "XYZZYCorporateLocationFieldControl" RUNAT= "serwer">
<Szablon>
<ASP:DropDownList IDENTYFIKATOR= "XYZZYCorporateLocationSelector" RUNAT= "serwer" />
</Szablon>
</SharePoint:Wartość parametru RenderingTemplate>
Powyższe jest zapisany w c:\Program filescommon filesmicrosoft sharedweb server extensions12controltemplates.
- Wreszcie, Tworzymy plik XML, aby zapisać do... 12XML katalogu. To jest CAML, który definiuje nasz typ danych niestandardowych i mój np., wygląda to tak:
<?XML Wersja="1.0" kodowanie="UTF-8" ?>
<FieldTypes>
<FieldType>
<Pole Nazwa="Atrybut TypeName">CorporateLocations</Pole>
<Pole Nazwa="Typu elementu nadrzędnego">Tekst</Pole>
<Pole Nazwa="TypeDisplayName">Atrakcje dla turystów</Pole>
<Pole Nazwa="TypeShortDescription">Wszystkie firmy XYZZY miejsc, w tym produkcji lub innych urządzeń.</Pole>
<Pole Nazwa="UserCreatable">PRAWDZIWE</Pole>
<Pole Nazwa="ShowInListCreate">PRAWDZIWE</Pole>
<Pole Nazwa="ShowInDocumentLibraryCreate">PRAWDZIWE</Pole>
<Pole Nazwa="ShowInSurveyCreate">PRAWDZIWE</Pole>
<Pole Nazwa="ShowInColumnTemplateCreate">PRAWDZIWE</Pole>
<Pole Nazwa="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Wersja = 1.0.0.0, Kultura = neutral, PublicKeyToken = b0b19e85410990c4</Pole>
<RenderPattern Nazwa="DisplayPattern">
<Przełącznik>
<Wyrażenie>
<Kolumna />
</Wyrażenie>
<Sprawa Wartość=""/>
<Domyślnie>
<HTML>
<![CDATA[<span style = "color:Czerwony"><b>]]>
</HTML>
<Kolumna SubColumnNumber="0" HTMLEncode="PRAWDZIWE"/>
<HTML><![CDATA[</b></zakres>]]></HTML>
</Domyślnie>
</Przełącznik>
</RenderPattern>
</FieldType>
</FieldTypes>
Ten plik XML dodaje typ danych niestandardowych do WSS "biblioteka" i odpowiada to GAC miał montaż.
Po przeniesieniu wszystkich tych bitów na miejsce, polecenie iisreset na serwerze i należy wszystkie zaczynają działa ładnie.
za pomocą System.Web.UI;
za pomocą System.Web.UI.WebControls;
Jestem próbując wdrożyć rozwiązanie. Jednak ja zamiast DropDownList, Mam tylko opcję DropDownChoiceList. Czy stało się dowiedzieć jak dodać elementy do DropDownChoiceList? Jesteśmy za pomocą programu SharePoint 2007 I dodatek SP1 dla programu Visual Studio 2005 SP1.