ビジネス シナリオ:
製造会社のコケの企業全体に実装 30+ サイトと数十の企業の部門.
ビジネス目標:
ビジネス グループの多数にもかかわらず (部門, 場所, など), 特定のデータは、グローバル レベルで維持する必要があります。. たとえば, 会社のすべての物理的な場所の権限のマスター リスト (例えば. 製造設備, 倉庫の場所, 営業所) 中央に維持する必要があります。.
技術的な問題:
企業分類は複数のサイト コレクションを使用して実装されました. 我々 の物理的な場所の権限リストをカスタムの WSS リスト作成と思ってください。. [, 我々 はコンテンツ タイプの列を必要なとき (または、リストまたはドキュメント ライブラリに追加する列) 企業の場所が含まれています。, 「参照を使用して列を作成するか" データ型とこのマスター リストにポイント.
残念なことに, 参照データ型"ローカルのソース リストにアクセスする必要があります。" 権限の私達のリストがサイト コレクションにまたがることはできないことを意味.
技術ソリューション:
新しいカスタム データ型に基づいて SPField を実装し、マスターの WSS リストからそのリスト項目の設定 UI に DropDownList として表されます実装.
我々 と呼ばれる新しいサイト コレクションを作成 "http://localhost/EnterpriseData". そこ, 我々 は「企業の場所」という名前のカスタム リストを作成. このリストは標準的な"タイトルを使用してだけ" 企業の実際の場所のリストを格納するフィールド.
いずれかの手順をいくつか離散 WSS でカスタム データ型を作成するには. 彼らは:
- SPField から継承するクラスを定義します。 (必要な場合その他のフィールドから 1 つを継承可能性があります。).
ここでは、そのためのコード:
パブリック クラス XYZZYCorporateLocationField : SPFieldText
{
パブリック XYZZYCorporateLocationField
(SPFieldCollection フィールド, 文字列 typeName, 文字列 displayName)
: ベース(フィールド, typeName, displayName) { }
パブリック XYZZYCorporateLocationField
(SPFieldCollection フィールド, 文字列 displayName)
: ベース(フィールド, displayName) { }
パブリック オーバーライド BaseFieldControl FieldRenderingControl
{
取得
{
BaseFieldControl コントロール = 新機能 XYZZYCorporateLocationFieldControl();
コントロール。フィールド名 = この.InternalName;
戻り値 コントロール;
} //取得
} // fieldrenderingcontrol
パブリック オーバーライド 文字列 GetValidatedString(オブジェクト 値)
{
場合 (この.必須 || 値です。ToString().等しい(文字列.空))
{
スロー 新機能 SPFieldValidationException (「部門は割り当てられません。");
}
戻り値 ベース.GetValidatedString(値);
} // getvalidatedstring
} // XYZZYCorporateLocation
- 基本フィールド コントロールから継承する別のクラスを定義します。, ように:
パブリック クラス XYZZYCorporateLocationFieldControl : BaseFieldControl
{
保護 DropDownList XYZZYCorporateLocationSelector;
保護 オーバーライド 文字列 DefaultTemplateName
{
取得
{
戻り値 "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName
パブリック オーバーライド オブジェクト 値
{
取得
{
EnsureChildControls();
戻り値 この.SelectedValue XYZZYCorporateLocationSelector。;
} // 取得
セット
{
EnsureChildControls();
この.XYZZYCorporateLocationSelector.SelectedValue = (文字列)この.ItemFieldValue;
} // セット
} // オブジェクト値をオーバーライドします。
保護 オーバーライド void CreateChildControls()
{
場合 (この.フィールド = = null || この.ControlMode = = SPControlMode.ディスプレイ)
戻り値;
ベース.CreateChildControls();
この.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer。("XYZZYCorporateLocationSelector");
場合 (この.XYZZYCorporateLocationSelector = = null)
スロー 新機能 例外("エラー: 読み込むことができません。ASCX ファイル!");
場合 (!この.IsPostBack ページ。)
{
使用してください。 (SPSite サイト = 新機能 SPSite("http://localhost/enterprisedata"))
{
使用してください。 (SPWeb web サイトを =。OpenWeb())
{
SPList 現時点 web を =。リスト[「企業の場所"];
foreach (SPItem XYZZYCorporateLocation で currentList.Items)
{
場合 (XYZZYCorporateLocation[「タイトル"] == null) 続行;
文字列 件名;
タイトル = XYZZYCorporateLocation[「タイトル"].ToString();
この.XYZZYCorporateLocationSelector.Items.Add
(新機能 ListItem(件名, 件名));
} // foreach
} // spweb の web を使用して site.openweb を =()
} // spsite のサイトを使用して新しい spsite を =("http://localhost/enterprisedata")
} // そうでない場合、ポストバック
} // CreateChildControls
} // XYZZYCorporateLocationFieldControl
上記のコードは基本的に DropDownList にある WSS カスタム リストから値を設定するロジックを実装します。 http://localhost/enterprisedata 名前付きの「企業部門」.
1 つの .cs ファイルで両方のクラスを定義しました。, それをコンパイルし、GAC に配置 (強い必要, もちろんです).
-
コントロール テンプレートを実装します。 (.ascx) 示すように:
<%@ コントロール 言語="C#" 継承="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,バージョン 12.0.0.0 文化を = = ニュートラル,PublicKeyToken = は 71e9bce111e9429c" compilationMode"常に =" %>
<%@ 登録 Tagprefix"wssawc =" Namespace="Microsoft.SharePoint.WebControls" アセンブリ="Microsoft.SharePoint, バージョン = 12.0.0.0, カルチャ ニュートラル =, PublicKeyToken = は 71e9bce111e9429c" %> <%@ 登録 Tagprefix"SharePoint を =" Namespace="Microsoft.SharePoint.WebControls" アセンブリ="Microsoft.SharePoint, バージョン = 12.0.0.0, カルチャ ニュートラル =, PublicKeyToken = は 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID"XYZZYCorporateLocationFieldControl =" runat「サーバー」を =>
<テンプレート>
<asp:DropDownList ID"XYZZYCorporateLocationSelector =" runat"server =" />
</テンプレート>
</SharePoint:RenderingTemplate>
上記が c に保存されます。:\プログラム \ 共通ファイル \ ファイルにサーバー extensions12controltemplates.
- 最後に, 我々 に保存する XML ファイルを作成、... 12XML ディレクトリ. これは、カスタム データ型を定義する CAML と私の例, 次のような:
<?xml バージョン="1.0" エンコード="utf-8" ?>
<フィールド型>
<FieldType>
<フィールド 名前="TypeName">CorporateLocations</フィールド>
<フィールド 名前="ParentType">本文</フィールド>
<フィールド 名前="TypeDisplayName">企業の場所</フィールド>
<フィールド 名前="TypeShortDescription">製造用又はその他の施設を含むすべての XYZZY 企業の場所.</フィールド>
<フィールド 名前="UserCreatable">真</フィールド>
<フィールド 名前="ShowInListCreate">真</フィールド>
<フィールド 名前="ShowInDocumentLibraryCreate">真</フィールド>
<フィールド 名前="ShowInSurveyCreate">真</フィールド>
<フィールド 名前="ShowInColumnTemplateCreate">真</フィールド>
<フィールド 名前="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, バージョン 1.0.0.0 を =, カルチャ ニュートラル =, PublicKeyToken = b0b19e85410990c4</フィールド>
<RenderPattern 名前="DisplayPattern">
<スイッチ>
<Expr>
<列 />
</Expr>
<ケース 値=""/>
<既定>
<HTML>
<![CDATA[<またがるスタイル ="色:「赤」><b>]]>
</HTML>
<列 SubColumnNumber="0" HTMLEncode="真"/>
<HTML><![CDATA[</b></スパン>]]></HTML>
</既定>
</スイッチ>
</RenderPattern>
</FieldType>
</フィールド型>
この XML ファイル WSS"ライブラリにカスタム データ型を追加します" GAC に対してと一致するアセンブリがあった.
これらのすべてのビットを所定の位置に移動した後, サーバーとそれに iisreset 心地よく働いてすべてスタートする必要があります。.
System.Web.UI を使用してください。;
System.Web.UI.WebControls を使用してください。;
私は、ソリューションを実装しようとしています。. しかし私 DropDownList の代わりに, 私は DropDownChoiceList のオプションがあります。. あなたは、DropDownChoiceList にアイテムを追加する方法を知っているに起こる? 我々 は、SharePoint を使用しています。 2007 SP1 および Visual Studio 2005 SP1.