MOSS: 機能例-カスタム データ型

ビジネス シナリオ:

製造会社のコケの企業全体に実装 30+ サイトと数十の企業の部門.

ビジネス目標:

ビジネス グループの多数にもかかわらず (部門, 場所, など), 特定のデータは、グローバル レベルで維持する必要があります。. たとえば, 会社のすべての物理的な場所の権限のマスター リスト (例えば. 製造設備, 倉庫の場所, 営業所) 中央に維持する必要があります。.

技術的な問題:

企業分類は複数のサイト コレクションを使用して実装されました. 我々 の物理的な場所の権限リストをカスタムの WSS リスト作成と思ってください。. [, 我々 はコンテンツ タイプの列を必要なとき (または、リストまたはドキュメント ライブラリに追加する列) 企業の場所が含まれています。, 「参照を使用して列を作成するか" データ型とこのマスター リストにポイント.

残念なことに, 参照データ型"ローカルのソース リストにアクセスする必要があります。" 権限の私達のリストがサイト コレクションにまたがることはできないことを意味.

技術ソリューション:

新しいカスタム データ型に基づいて SPField を実装し、マスターの WSS リストからそのリスト項目の設定 UI に DropDownList として表されます実装.

我々 と呼ばれる新しいサイト コレクションを作成 "http://localhost/EnterpriseData". そこ, 我々 は「企業の場所」という名前のカスタム リストを作成. このリストは標準的な"タイトルを使用してだけ" 企業の実際の場所のリストを格納するフィールド.

いずれかの手順をいくつか離散 WSS でカスタム データ型を作成するには. 彼らは:

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

  1. 基本フィールド コントロールから継承する別のクラスを定義します。, ように:

パブリック クラス 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 に配置 (強い必要, もちろんです).

  1. コントロール テンプレートを実装します。 (.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.

  1. 最後に, 我々 に保存する 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 心地よく働いてすべてスタートする必要があります。.

3 「上の思考MOSS: 機能例-カスタム データ型

  1. Alejandro
    こんにちはポール,
    最初です, 記事をありがとう, 非常に興味深いですので. 1 つだけ質問;
    リストのデータシート ビューのカスタム フィールドの種類を正しくレンダリングするために posible であるかどうかは知っています。?
    それを作成するすべてのカスタム フィールド タイプはデータシート ビューで読み取り専用として表示されるため (MSDN, たとえば, 非常に私を助けていません :-S).
    おかげで
  2. リンジー

    私は、ソリューションを実装しようとしています。. しかし私 DropDownList の代わりに, 私は DropDownChoiceList のオプションがあります。. あなたは、DropDownChoiceList にアイテムを追加する方法を知っているに起こる? 我々 は、SharePoint を使用しています。 2007 SP1 および Visual Studio 2005 SP1.

メッセージを残してください

あなたのメールアドレスが公開されることはありません. 必須フィールドは、マークされています *