İş senaryosu:
MOSS kurumsal çapta uygulanması için üretim şirketi ile 30+ siteler ve birkaç düzine şirket bölümler.
İş hedefi:
Çok sayıda iş grupları rağmen (bölümler, Mekanlar, vb), belirli verileri genel bir düzeyde muhafaza edilmelidir. Örneğin, şirketin tüm fiziksel konumlar bir yetkili ana listesi (e.g. üretim tesisleri, ambar konumunuz, satış ofisleri) Merkezi bir konumda muhafaza edilmelidir.
Teknik bir sorun:
Kurumsal sınıflandırma kullanarak birden çok site koleksiyonlarındaki uygulanmıştır. Biz isterdi özel WSS liste içinde fiziksel konumlar yetkili listesi oluşturmak için. O zaman, Ne zaman biz bir içerik türüne sahip bir sütun için gerekli (veya bir liste veya doktor kütüphanesine eklenir sütun) Bu kurumsal yerlerde bulunan, "arama kullanarak bir sütun oluşturmak" veri türü ve nokta bu ana listesi.
Ne yazık ki, Arama veri türleri bir kaynak listesi "yerel olarak erişmeniz gerekir" yetkili listemize site koleksiyonları dağıtılamaz anlamı.
Teknik çözüm:
Yeni bir özel veri türü temel alınarak SPField hayata ve temsil edilen bir DropDownList kimin ListItems ana WSS listeden doldurmak UI alet.
Adı verilen yeni bir site koleksiyonu hazırlandı "http://localhost/EnterpriseData". Orada, "Kurumsal yerlerde" adında özel bir liste oluşturdu. Bu liste, sadece standart "başlığını kullanır" gerçek şirket konumların listesini içeren alan.
Bir WSS içindeki özel veri türü oluşturmak için birkaç ayrı adımları takip. Onlar:
- SPField devralan bir sınıf tanımlayın (bir ihtiyaç halinde diğer alanlardan miras).
İşte bunun için kod:
Genel sınıf XYZZYCorporateLocationField : SPFieldText
{
Genel XYZZYCorporateLocationField
(SPFieldCollection alanları, dize typeName, dize displayName)
: Bankası(alanları, typeName, displayName) { }
Genel XYZZYCorporateLocationField
(SPFieldCollection alanları, dize displayName)
: Bankası(alanları, displayName) { }
Genel geçersiz kılma BaseFieldControl FieldRenderingControl
{
Al
{
BaseFieldControl kontrol = Yeni XYZZYCorporateLocationFieldControl();
Denetim. FieldName = Bu.InternalName;
geri dönmek Denetim;
} //Al
} // fieldrenderingcontrol
Genel geçersiz kılma dize GetValidatedString(Nesne değer)
{
Eğer (Bu.Gerekli || değeri. ToString().Eşittir(Dize.Boş))
{
atmak Yeni SPFieldValidationException ("Bölümü atanmış değil.");
}
geri dönmek Bankası.GetValidatedString(değer);
} // getvalidatedstring
} // XYZZYCorporateLocation
- Temel alan denetiminden devralan bir sınıf tanımlayın, olarak:
Genel sınıf XYZZYCorporateLocationFieldControl : BaseFieldControl
{
korumalı DropDownList XYZZYCorporateLocationSelector;
korumalı geçersiz kılma dize DefaultTemplateName
{
Al
{
geri dönmek "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName
Genel geçersiz kılma Nesne Değer
{
Al
{
EnsureChildControls();
geri dönmek Bu.SelectedValue XYZZYCorporateLocationSelector.;
} // Al
ayarla
{
EnsureChildControls();
Bu.XYZZYCorporateLocationSelector.SelectedValue = (dize)Bu.ItemFieldValue;
} // ayarla
} // nesne değeri geçersiz
korumalı geçersiz kılma geçersiz CreateChildControls()
{
Eğer (Bu.Alan == NULL || Bu.ControlMode == SPControlMode.Görüntüleme)
geri dönmek;
Bankası.CreateChildControls();
Bu.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer.("XYZZYCorporateLocationSelector");
Eğer (Bu.XYZZYCorporateLocationSelector == NULL)
atmak Yeni Özel durum("HATASI: Yüklenemiyor. ASCX dosya!");
Eğer (!Bu.IsPostBack sayfa.)
{
kullanma (SPSite Site = Yeni SPSite("http://localhost/enterprisedata"))
{
kullanma (SPWeb Web sitesi =. OpenWeb())
{
SPList.Update() currentList web =. Listeler["Kurumsal yerlerde"];
foreach (SPItem XYZZYCorporateLocation içinde currentList.Items)
{
Eğer (XYZZYCorporateLocation["Başlığı"] == NULL) devam etmek;
dize Title;
Title = XYZZYCorporateLocation["Başlığı"].ToString();
Bu.XYZZYCorporateLocationSelector.Items.Add
(Yeni ListItem(Title, Title));
} // foreach
} // SPWeb web kullanarak site.openweb =()
} // SPSite sitesini kullanarak yeni spsite =("http://localhost/enterprisedata")
} // Eğer değilse geri gönderme
} // CreateChildControls
} // XYZZYCorporateLocationFieldControl
Yukarıdaki kod, temelde DropDownList WSS özel listesinde yer alan değer ile yerleştirmek için mantığını uygular http://localhost/enterprisedata ve adlandırılmış "Kurumsal bölümler".
Bir tek .cs dosyası her iki sınıf tanımlanan, Bu derlenmiş ve GAC içine koy (güçlü gerekli, Elbette).
-
Denetim şablonu uygulamak (.ascx) görüldüğü gibi:
<%@ Denetim Dil"C# =" Devralır="Microsoft.SharePoint.Portal.serveradmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Sürüm 12.0.0.0, kültür = bağımsız =,PublicKeyToken = 71e9bce111e9429c" compilationMode"Her zaman =" %>
<%@ Üye ol Tagprefix"wssawc =" Namespace="Microsoft.SharePoint.WebControls" Derleme="Microsoft.SharePoint, Sürüm 12.0.0.0 =, Kültür tarafsız =, PublicKeyToken = 71e9bce111e9429c" %> <%@ Üye ol Tagprefix"SharePoint =" Namespace="Microsoft.SharePoint.WebControls" Derleme="Microsoft.SharePoint, Sürüm 12.0.0.0 =, Kültür tarafsız =, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate KİMLİĞİ"XYZZYCorporateLocationFieldControl =" runat= "sunucu">
<Şablon>
<ASP:DropDownList KİMLİĞİ"XYZZYCorporateLocationSelector =" runat= "sunucu" />
</Şablon>
</SharePoint:RenderingTemplate>
Yukarıda c kaydedilir:\Program filescommon filesmicrosoft sharedweb server extensions12controltemplates.
- Nihayet, Biz içine kaydetmek için bir XML dosyası oluşturmak..... 12XML dizini. Bu bizim özel veri türü tanımlar CAML olduğunu ve benim gibi, Bu gibi görünüyor:
<?XML Sürüm="1.0" kodlama="UTF-8" ?>
<FieldTypes>
<FieldType>
<Alan Adı="TypeName">CorporateLocations</Alan>
<Alan Adı="ParentType">Metin</Alan>
<Alan Adı="TypeDisplayName">Kurumsal yerlerde</Alan>
<Alan Adı="TypeShortDescription">Üretim veya diğer özellikleri de dahil olmak üzere tüm XYZZY kurumsal yerlerde.</Alan>
<Alan Adı="UserCreatable">GERÇEK</Alan>
<Alan Adı="ShowInListCreate">GERÇEK</Alan>
<Alan Adı="ShowInDocumentLibraryCreate">GERÇEK</Alan>
<Alan Adı="ShowInSurveyCreate">GERÇEK</Alan>
<Alan Adı="ShowInColumnTemplateCreate">GERÇEK</Alan>
<Alan Adı="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Sürüm 1. 0 =, Kültür tarafsız =, PublicKeyToken = b0b19e85410990c4</Alan>
<RenderPattern Adı="DisplayPattern">
<Anahtarı>
<İfade>
<Sütun />
</İfade>
<Dava Değer=""/>
<Varsayılan>
<HTML>
<![CDATA[<Stil span = "renk:Kırmızı"><b>]]>
</HTML>
<Sütun SubColumnNumber="0" HTMLEncode="GERÇEK"/>
<HTML><![CDATA[</b></yayılma>]]></HTML>
</Varsayılan>
</Anahtarı>
</RenderPattern>
</FieldType>
</FieldTypes>
Bu XML dosyası özel veri türü WSS "kütüphane ekler." ve GAC karşı eşleşen derleme vardı.
Bu bitler yerine taşıdıktan sonra, iisreset server ve bu güzel çalışma tüm başlamak gerekir.
System.Web.UI kullanma;
System.Web.UI.WebControls kullanma;
Çözümünüzü uygulamak bulmaya çalışıyorum. Ancak ben DropDownList yerine, Ben sadece bir DropDownChoiceList için seçenek var. Bir DropDownChoiceList için öğeleri eklemek nasıl biliyor acaba? Biz SharePoint kullanarak 2007 SP1 ve Visual Studio 2005 SP1.