次の方法で共有


ユーザー設定フィールド型を作成する

ここでは、最も一般的な状況でユーザー設定フィールドの種類を作成する方法を手順を追って説明します。一般に、表示モードでのリスト ビューへのフィールドのレンダリングは、フィールド定義ファイル内の RenderPattern によって処理され、新規モードと編集モードでのフィールドのレンダリングは、CreateChildControls メソッドと連動する単一のレンダリング テンプレートによって処理されます。ここでは、10 桁の国際標準図書番号 (ISBN) を保持することを目的としたフィールドを作成します。

前提条件

このチュートリアルでは、Windows Server 2003 オペレーティング システムを実行しているコンピュータに、次のアプリケーションをインストールしておく必要があります。

  • Windows SharePoint Services 3.0

  • Microsoft Visual Studio 2005

  • Microsoft Visual Studio 2005 Extensions for Windows SharePoint Services 3.0 Version 1.0 以降

ユーザー設定フィールド型の開発準備をする

  1. Visual Studio で、[ツール] メニューの [外部ツール] を選択します。

  2. [外部ツール] ダイアログで、[追加] をクリックし、[タイトル] に「アセンブリの公開キーを取得」と入力します。

  3. sn.exe を参照して、[コマンド] ボックスに入力します。通常は、C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe にインストールされています。

  4. [引数] ボックスに 「-Tp "$(TargetPath)"」と入力します (大文字と小文字が区別されます)。

  5. [出力ウィンドウを使用] チェック ボックスをオンにします。

  6. [OK] をクリックします。[ツール] メニューに新しいコマンドが追加されます。

プロジェクトをセットアップする

ユーザー設定フィールド プロジェクトをセットアップするには

  1. Visual Studio 2005 で、[ファイル] メニューの [新しいプロジェクト] をクリックします。

  2. [新しいプロジェクト] ダイアログの [プロジェクトの種類] ウィンドウで、[SharePoint] を選択します (SharePoint プロジェクト オプションがウィンドウに表示されていない場合は、Visual Studio 2005 Extensions for Windows SharePoint Services 3.0 Version 1.0 以降をインストールする必要があります)。

  3. [テンプレート] ウィンドウで [空のプロジェクト] を選択します。

  4. [名前] ボックスに「ISBN_Field_Type」と入力します。

  5. [OK] をクリックします。

  6. ソリューション エクスプローラで、プロジェクト名 [ISBN_Field_Type] を右クリックし、[プロパティ] をクリックして、[ビルド イベント] タブをクリックします。

    [ビルド後に実行するコマンド ライン] ボックスに、次のコマンド ラインを入力します。このコマンド ラインにより、プロジェクトをリビルドするたびにプロジェクトの最新バージョンの各ファイルが適切な場所にコピーされます。また、Windows SharePoint Services 3.0 が再起動され、最新バージョンのアセンブリが読み込まれます。

    cd "$(ProjectDir)"
    "%programfiles%\microsoft visual studio 8\sdk\v2.0\bin\gacutil" /i "$(TargetPath)" /nologo /f
    %systemroot%\system32\iisapp.vbs /a "SharePoint_App_Pool" /r
    xcopy *.ascx "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES\" /y
    xcopy fldtypes*.xml "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\XML\" /y
    
  7. SharePoint_App_Pool を、Windows SharePoint Services 3.0 Web アプリケーションに割り当てられている Internet Information Server (IIS) アプリケーション プールの実際の名前で置き換えます。通常、この名前は、アプリケーションを保有する IIS Web サイトと同じ名前です (例 : "SharePoint - 80"。名前にスペースが含まれていない場合は引用符を省略できます)。

  8. タブで有効になっている他のコントロールをクリックすると、Visual Studio で変更が検出され、タブ ラベルにアスタリスクが表示されます。次に、[ファイル] メニューの [すべてを保存] をクリックします。

  9. [ソリューション エクスプローラ] でプロジェクト名 ISBN_Field_Type を右クリックし、[追加]、[新しい項目] の順に選択します。

  10. [新しいアイテムの追加] ダイアログの [カテゴリ] ウィンドウで [SharePoint] を選択し、[テンプレート] ウィンドウで [フィールド コントロール] を選択します。

  11. [名前] ボックスに「ISBN」と入力し、[追加] をクリックします。これにより、後の手順で編集する 2 つのファイル (ISBN.Field.cs と ISBN.FieldControl.cs) が作成されます。厳密な名前も作成され、プロジェクトの Temporary.snk というファイルに保存されます。

  12. ソリューション エクスプローラで、プロジェクト名 [ISBN_Field_Type] を右クリックし、[プロパティ] をクリックします。

  13. [アプリケーション] タブを開き、[アセンブリ名] を「MyCompany.SharePoint.ISBN_Field_Type」に変更します (このチュートリアル全体を通じて、MyCompany を勤務先の会社名に置き換えてください)。

  14. [既定の名前空間] を「MyCompany.SharePoint」に変更します。

  15. ツール バーの [すべてを保存] をクリックします。

  16. ソリューション エクスプローラで、[参照設定] ノードを右クリックし、[参照の追加] をクリックします。

  17. [参照の追加] ダイアログで、[参照] タブを開き、C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\ に移動します。

  18. PresentationFramework.dll を選択し、[OK] をクリックします (このアセンブリには、次の手順で作成するファイル内で参照する ValidationRule クラスの定義が含まれています)。

検証規則クラスを作成する

検証規則クラスを作成するには

  1. ソリューション エクスプローラで、プロジェクト名 [ISBN_Field_Type] を右クリックし、[追加] をクリックして [クラス] をクリックします。

  2. [カテゴリ] ウィンドウで [Visual C# プロジェクト アイテム] を選択し、[テンプレート] ウィンドウで [クラス] を選択します。

  3. [名前] ボックスに「ISBN10ValidationRule.cs」と入力し、[追加] をクリックします。

  4. 作成された ISBN10ValidationRule.cs ファイルで、次の using ステートメントを追加します。

    using System.Text.RegularExpressions;
    using System.Windows.Controls;
    using System.Globalization;
    
  5. Namespace Naming Guidelines」のガイドラインに従って、名前空間を変更します。このチュートリアルでは、MyCompany.System.Windows.Controls を使用します。

  6. クラス宣言を次のコードで置き換えます。

    public class ISBN10ValidationRule : ValidationRule
    {
        private const Int32 ISBNMODULO = 11;
    
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            String iSBN = (String)value;
            String errorMessage = "";
    
            Regex rxISBN = new Regex(@"^(?'GroupID'\d{1,5})-(?'PubPrefix'\d{1,7})-(?'TitleID'\d{1,6})-(?'CheckDigit'[0-9X]{1})$");
    
            if (!rxISBN.IsMatch(iSBN))
            {
                errorMessage = "An ISBN must have this structure:\n1-5 digit Group ID, hyphen, \n1-7 digit Publisher Prefix, hyphen, \n1-6 digit Title ID, hyphen, \n1 Check Digit (which can be \"X\" to indicate \"10\").\n";
            }
    
            if (errorMessage == "") // Matched the RegEx, so check for group length errors.
            {
                Match mISBN = rxISBN.Match(iSBN);
                GroupCollection groupsInString = mISBN.Groups;
    
                String groupID = groupsInString["GroupID"].Value;
                String pubPrefix = groupsInString["PubPrefix"].Value;
    
                if ((groupID.Length + pubPrefix.Length) >= 9)
                {
                    errorMessage = "The Group ID and Publisher Prefix can total no more than 8 digits.\n";
                }
    
                String titleID = groupsInString["TitleID"].Value;
    
                if (((groupID.Length + pubPrefix.Length) + titleID.Length) != 9)
                {
                    errorMessage = errorMessage + "The Group ID, Publisher Prefix, and \nTitle ID must total exactly 9 digits.\n";
                }
    
                if (errorMessage == "") //No group length errors, so verify the check digit algorithm.
                {
                    Int32 checkDigitValue;
                    String checkDigit = groupsInString["CheckDigit"].Value;
    
                    // To ensure check digit is one digit, "10" is represented by "X".
                    if (checkDigit == "X")
                    {
                        checkDigitValue = 10;
                    }
                    else
                    {
                        checkDigitValue = Convert.ToInt32(checkDigit);
                    }
    
                    String iSBN1st3Groups = groupID + pubPrefix + titleID; //Concatenate without the hyphens.
    
                    // Sum the weighted digits.
                    Int32 weightedSum = (10 * Convert.ToInt32(iSBN1st3Groups.Substring(0, 1))) +
                                         (9 * Convert.ToInt32(iSBN1st3Groups.Substring(1, 1))) +
                                         (8 * Convert.ToInt32(iSBN1st3Groups.Substring(2, 1))) +
                                         (7 * Convert.ToInt32(iSBN1st3Groups.Substring(3, 1))) +
                                         (6 * Convert.ToInt32(iSBN1st3Groups.Substring(4, 1))) +
                                         (5 * Convert.ToInt32(iSBN1st3Groups.Substring(5, 1))) +
                                         (4 * Convert.ToInt32(iSBN1st3Groups.Substring(6, 1))) +
                                         (3 * Convert.ToInt32(iSBN1st3Groups.Substring(7, 1))) +
                                         (2 * Convert.ToInt32(iSBN1st3Groups.Substring(8, 1))) +
                                          checkDigitValue;
    
                    Int32 remainder = weightedSum % ISBNMODULO;  // ISBN is invalid if weighted sum modulo 11 is not 0.
    
                    if (remainder != 0)
                    {
                        errorMessage = "Number fails Check Digit verification.";
                    }
    
                    if (errorMessage == "") // Passed check digit verification. 
                    {
                        return new ValidationResult(true, "This is a valid ISBN.");
                    }// end check digit verification passed
    
                    else // the check digit verification failed
                    {
                        return new ValidationResult(false, errorMessage);
                    }
    
                }// end no group length errors
    
                else // There was some error in a group length
                {
                    return new ValidationResult(false, errorMessage);
                }
    
            }// end RegEx match succeeded
    
            else // There was a RegEx match failure
            {
                  return new ValidationResult(false, errorMessage);
            }
    
        }// end Validate method 
    
    }// end ISBN10ValidationRule class
    

    作成した検証規則クラスには、詳細な検証ロジックがすべて保持されます。検証規則クラスの詳細については、System.Text.RegularExpressions および ValidationRule を参照してください。

ユーザー設定フィールド クラスを作成する

ユーザー設定フィールド クラスを作成するには

  1. ISBN.Field.cs ファイルを開きます。このファイルには、GUID、2 つの必須コンストラクタ、および FieldRenderingControl プロパティのオーバーライドが既に用意されています。これらのコントロールの変更が必要になることはほとんどありません。既定では、SPFieldText から継承する新しいフィールド クラスが宣言されます。このチュートリアルでは、これが適切な選択です (ユーザー設定フィールド型の派生元として使用できるその他のクラスの詳細については、「ユーザー設定フィールドクラス」を参照してください)。

  2. 次の using ステートメントを ISBN.Field.cs に追加します。"MyCompany" を勤務先の会社名に必ず変更してください。

    using System.Windows.Controls;
    using System.Globalization;
    using MyCompany.SharePoint.WebControls;
    using MyCompany.System.Windows.Controls;
    
  3. 名前空間を MyCompany.SharePoint に変更します。

  4. 次の GetValidatedString メソッドのオーバーライドを ISBNField クラスに追加します。

    public override string GetValidatedString(object value)
    {
        if ((this.Required == true)
           &&
           ((value == null)
            ||
           ((String)value == "")))
        {
            throw new SPFieldValidationException(this.Title 
                + " must have a value.");
        }
        else
        {
            ISBN10ValidationRule rule = new ISBN10ValidationRule();
            ValidationResult result = rule.Validate(value, CultureInfo.InvariantCulture);
    
            if (!result.IsValid)
            {
                throw new SPFieldValidationException((String)result.ErrorContent);
            }
            else
            {
                return base.GetValidatedString(value);
            }
        }
    }// end GetValidatedString
    

    次に示すように、このオーバーライドは、GetValidatedString のオーバーライドの一般的なパターンを示しています。

    • GetValidatedString メソッドのオーバーライドは、フィールドが必須かどうかをチェックし、必須であれば、値が null または空の String のときに SPFieldValidationException 例外をスローします。この例外は、ユーザーが作成または編集したリスト アイテムを保存しようとしたときに、[新しいアイテム] ページおよび [アイテムの編集] ページでキャッチされます。この場合、ページは開いたままになり、この例外の Message() プロパティによって、空のフィールドの下にエラー メッセージが表示されます。

    • 値が無効である場合、GetValidatedString のオーバーライドは SPFieldValidationException をスローします。これにより、無効なフィールドの下にエラー メッセージが表示されます。

    • 値がユーザー設定の入力規則を通過すると、GetValidatedString のオーバーライドは基本 GetValidatedString を呼び出します。

  5. ファイルを保存して閉じます。

フィールド レンダリング コントロールを作成する

フィールド レンダリング コントロールを作成するには

  1. ISBN.FieldControl.cs を開きます。コントロールの GUID が既に指定されています。既定では、TextField から継承する新しいフィールド クラスが宣言されます。このチュートリアルでは、これが適切な選択です (ユーザー設定フィールド コントロールの派生元として使用できる他のクラスの詳細については、「フィールド レンダリング コントロール」を参照してください)。

  2. 次の using ステートメントを追加します。

    using System.Web.UI.WebControls;
    
  3. 名前空間を MyCompany.SharePoint.WebControls に変更します。

  4. ASP.NET の Label Web コントロールの保護されたフィールドを追加します。このフィールドは、新規モードまたは編集モードでレンダリングされるときに、各 ISBN 番号の前に "ISBN" というプレフィックスを追加します。ISBN 番号自体を保持するために、保護された TextBox フィールドを追加する必要はありません。このカスタムの ISBNFieldControl は、TextField からこのフィールドを継承するためです。

    protected Label ISBNPrefix;
    
  5. 次に、DefaultTemplateName プロパティの次のオーバーライドを追加します。このプロパティに割り当てる String は, .ascx ファイル内の RenderingTemplate オブジェクトの ID です。この .ascx ファイルは、後の手順で作成し、C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES フォルダに配置します。この例では、ControlTemplateTemplate、または TemplateName はオーバーライドしないので、RenderingTemplate は次のように呼び出されることになります。ControlTemplateTemplate を返し、これは次に TemplateName によって名前が指定されたすべての RenderingTemplateTemplate プロパティを返します。最後に、TemplateName の get アクセサが DefaultTemplateName を返します。新規モード用と編集モード用にそれぞれ別のテンプレートがある場合など、さらに複雑なケースでは、上記の 1 つ以上のプロパティと、場合によっては AlternateTemplateName プロパティまたは DefaultAlternateTemplateName プロパティをオーバーライドする必要があります。

    protected override string DefaultTemplateName
    {
        get
        {
            return "ISBNFieldControl";
        }
    }
    
  6. CreateChildControls メソッドの次のオーバーライドを追加します。基になる ISBNField が null の場合、このオーバーライドは何も実行しません (null になるのは、ISBNFieldControl が ISBNField の FieldRenderingControl プロパティの setter とは関係なく作成されている場合です。ISBN.Field.cs の FieldRenderingControl のオーバーライドを参照してください)。このメソッドは、SPControlMode が Display (表示) の場合にも何も実行しません。これは、表示モードでのフィールドのレンダリングは、RenderPattern 要素によって通常どおり処理されるためです。この要素は、このチュートリアルで後ほど作成するフィールド定義で定義されます (他の状況では、表示モードでのレンダリングは、DisplayTemplateName プロパティで指定された特別なテンプレートによって実現されます。CreateChildControls がユーザー設定フィールド型に対して表示モードで何らかの処理を実行することはほとんどありません。ユーザー設定フィールドをレンダリングするさまざまな方法の詳細については、「カスタム フィールド レンダリングのパターン」を参照してください)。

    protected override void CreateChildControls()
    {
        if (this.Field != null && this.ControlMode != SPControlMode.Display)
        {
    
        }// end if there is a non-null underlying ISBNField and control mode is not Display
    
      //Do nothing if the ISBNField is null or control mode is Display.
    }
    
  7. 条件の最初の行として、基本メソッドの次の呼び出しを追加します。継承された子コントロールが、テンプレートではなく、基本 CreateChildControls によって全体的または部分的にレンダリングされる場合に確実に作成されるように、通常、このような呼び出しが必要となります。たとえば、(C:\program files\common files\microsoft shared\web server extensions\12\template\controltemplates にある) DefaultTemplates.ascx 内の "TextField" テンプレートは、子 TextBox をレンダリングしますが、CreateChildControls メソッドは、基になる SPFieldText フィールドの最大サイズに合わせて TextBox の最大サイズを調整します。基本 CreateChildControls は、動的な BaseValidator コントロールを作成する場合もあります。ただし、通常は基本メソッドのソース コードにはアクセスできないため、基本メソッドを呼び出す必要があるかどうか、また、必要がある場合はオーバーライドのどの場所で呼び出せばよいかを判断するために、実験してみる必要があります。

    // Make sure inherited child controls are completely rendered.
    base.CreateChildControls();
    
  8. 次の行を追加して、レンダリング テンプレート内の子コントロールを、ユーザー設定フィールド コントロールで宣言された (またはその親から継承した) 子コントロール フィールドに関連付けます。このレンダリング テンプレートは後の手順で作成するものですが、現時点でこの関連付けをしておく必要があります。基本 CreateChildControls を呼び出すと、継承された子コントロールは、カスタム レンダリング テンプレートではなく、ユーザー設定フィールド クラスの親が使用するレンダリング テンプレートに関連付けられるので、この基本の関連付けを新しい関連付けで置き換える必要があるためです。

    // Associate child controls in the .ascx file with the 
    // fields allocated by this control.
    this.ISBNPrefix = (Label)TemplateContainer.FindControl("ISBNPrefix");
    this.textBox = (TextBox)TemplateContainer.FindControl("TextField");
    
  9. コントロールの関連付けコードの下に、次の構造を追加します。ポストバックで再初期化を実行すると、子コントロールの値に対してユーザーが加えた変更がすべて取り消されるため、コードではポストバックで何も実行しないようにします。

        if (!this.Page.IsPostBack)
        {
    
        }// end if this is not a postback 
    
    //Do not reinitialize on a postback.
    
  10. 前の手順で追加した条件構造内に、コントロール モードが New (新規) のときに TextBox 子コントロールを既定の ISBN 値で初期化する次の内部条件を追加します。

    if (this.ControlMode == SPControlMode.New)
    {
        textBox.Text = "0-000-00000-0";
    
    } // end assign default value in New mode
    

    OnLoaD(EventArgs) メソッドは、ISBNFieldControl.Value を、コンテンツ データベースに現在のフィールド値を保持する ItemFieldValue の値に初期化するため、編集モードでは何も実行する必要はありません。この時点で、CreateChildControls のオーバーライドは次のようになります。

    protected override void CreateChildControls()
    {
        if (this.Field != null && this.ControlMode != SPControlMode.Display)
        {
            // Make sure inherited child controls are completely rendered.
            base.CreateChildControls();
    
            // Associate child controls in the .ascx file with the 
            // fields allocated by this control.
            this.ISBNPrefix = (Label)TemplateContainer.FindControl("ISBNPrefix");
            this.textBox = (TextBox)TemplateContainer.FindControl("TextField");
    
            if (!this.Page.IsPostBack)
            {
                if (this.ControlMode == SPControlMode.New)
                {
                    textBox.Text = "0-000-00000-0";
    
                } // end assign default value in New mode
    
            }// end if this is not a postback 
    
         //Do not reinitialize on a postback.
    
        }// end if there is a non-null underlying ISBNField and control mode is not Display
    
     // Do nothing if the ISBNField is null or control mode is Display.
    }
    
  11. Value() プロパティの次のオーバーライドを追加します。このプロパティは、UI 内のフィールドのプロパティです。エンド ユーザーが値を変更し、まだ保存していない場合、Value() プロパティは、基になる ISBNField (SPFieldText から派生) オブジェクトの実際の値、またはコンテンツ データベースに格納されたフィールド値であるとは限りません。get アクセサと set アクセサの両方で、まず EnsureChildControls を呼び出します (このメソッドは、必要に応じて CreateChildControls を呼び出します)。(1) 最初に基本プロパティを呼び出す、(2) 基本プロパティの set アクセサと get アクセサが EnsureChildControls を呼び出すことがわかっている、という場合を除き、EnsureChildControls の呼び出しは必須です。TextField から継承した基になる TextBox 子コントロールをまったく別の種類のコントロール (ドロップダウン リスト ボックスなど) で置き換えている場合、set アクセサと get アクセサでは、基本プロパティを呼び出すのではなく、そのコントロールを直接設定する必要があります。コントロールが最初に基になる ISBNField オブジェクトの値を確実に読み込むように、OnLoad() メソッドは、ISBNFieldControl.Value を ItemFieldValue (基になる ISBNField オブジェクトの値) の値に設定します。

    public override object Value
    {
        get
        {
            EnsureChildControls();
            return base.Value;
        }
        set
        {
             EnsureChildControls();
             base.Value = (String)value;
             // The value of the ISBNPrefix field is hardcoded in the
             // template, so it is not set here.
        }
    }
    

フィールド レンダリング テンプレートを作成する

レンダリング テンプレートを作成するには

  1. [ソリューション エクスプローラ] でプロジェクト名 ISBN_Field_Type を右クリックし、[追加]、[新しい項目] の順に選択します。

  2. [カテゴリ] ウィンドウで [Visual C# プロジェクト アイテム] を選択し、[テンプレート] ウィンドウで [テキスト ファイル] を選択します。

  3. [名前] ボックスに「ISBNFieldControl.ascx」と入力し、[追加] をクリックします (このファイルは、プロジェクト フォルダのサブフォルダには置かないでください。このチュートリアルで以前に作成したビルド後のコマンドでファイルが見つからなくなります)。

  4. 作成した ISBNFieldControl.ascx ファイルに以下のマークアップ テキストを追加します。

    <%@ Control Language="C#" %>
    <%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.WebControls" %>
    
    <SharePoint:RenderingTemplate ID="ISBNFieldControl" runat="server">
      <Template>
        <asp:Label ID="ISBNPrefix" Text="ISBN" runat="server" />
        &nbsp;
        <asp:TextBox ID="TextField" runat="server"  />
      </Template>
    </SharePoint:RenderingTemplate>
    

    このマークアップについて、次の点に注意してください。

    • RenderingTemplate の ID は、DefaultTemplateName プロパティのオーバーライドで使用した文字列と同じである必要があります。

    • Label コントロールの Text 属性は、変更されることがないため、テンプレートのここで設定します。

    • HTML の "&nbsp;" 要素は、2 つのコントロールの間に配置します。

    • TextBox の定義は、C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES\DefaultTemplates.ascx に定義されている "TextField" RenderingTemplate の定義と同じです。ただし、DefaultTemplateName のオーバーライドで、"TextField" テンプレートではなく、このカスタム テンプレートを指しているため、この定義をここで繰り返す必要があります。基本 CreateChildControls メソッド (上記参照) はこの ID でコントロールを参照するので、カスタム テンプレートでも同じ ID を使用します。

  5. ファイルを保存して閉じます。

フィールド型定義を作成する

フィールド型定義を作成するには

  1. Visual Studio でプロジェクトをビルドします。プロジェクトは完成していませんが、アセンブリの GUID と公開キー トークンを生成するために、この時点でビルドする必要があります。

  2. [ソリューション エクスプローラ] でプロジェクト名 ISBN_Field_Type を右クリックし、[追加]、[新しい項目] の順に選択します。

  3. [カテゴリ] ウィンドウで [Visual C# プロジェクト アイテム] を選択し、[テンプレート] ウィンドウで [XML ファイル] を選択します。

  4. [名前] ボックスに「fldtypes_ISBNField.xml」と入力し、[追加] をクリックします (ファイル名は "fldtypes" で始まる必要があります。また、このファイルはプロジェクト フォルダのサブフォルダには置かないでください。このチュートリアルで以前に作成したビルド後のコマンドで、ファイルが見つからなくなります)。

  5. 作成した fldtypes_ISBNField.xml ファイルに以下のマークアップ テキストを追加します。

    <?xml version="1.0" encoding="utf-8" ?>
    <FieldTypes>
      <FieldType>
        <Field Name="TypeName">ISBN</Field>
        <Field Name="ParentType">Text</Field>
        <Field Name="TypeDisplayName">ISBN</Field>
        <Field Name="TypeShortDescription">ISBN for a book</Field>
        <Field Name="UserCreatable">TRUE</Field>
        <Field Name="ShowOnListCreate">TRUE</Field>
        <Field Name="ShowOnSurveyCreate">TRUE</Field>
        <Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>
        <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
        <Field Name="FieldTypeClass">MyCompany.SharePoint.ISBNField, MyCompany.SharePoint.ISBN_Field_Type, Version=1.0.0.0, Culture=neutral, PublicKeyToken=token</Field>
    
      </FieldType>
    </FieldTypes>
    

    このファイルは、Windows SharePoint Services 3.0 のユーザー設定フィールド型を定義するものです。要素の目的と意味の詳細については、「ユーザー設定フィールド型の定義」、「FieldTypes 要素 (フィールド型)」、「FieldType 要素 (フィールド型)」、および「Field 要素 (フィールド型)」を参照してください。<Field Name="FieldTypeClass"> 要素は、1 行で記述する必要があります。

  6. <Field Name="FieldTypeClass"> 要素内で、完全修飾されたクラス名とアセンブリ名の MyCompany を勤務先の会社名で置き換え、token をアセンブリの公開キー トークンで置き換えます。公開キー トークンを取得するには、[ツール] メニューの [アセンブリの公開キーを取得] をクリックします。公開キー トークンが出力ウィンドウに表示されます。

  7. ファイルの最後の Field 要素のすぐ下に、各種 Field 要素と同じレベルにインデントして、次のマークアップ テキストを追加します。

    <RenderPattern Name="DisplayPattern">
      <Switch>
        <Expr>
          <Column/>
        </Expr>
        <Case Value="">
        </Case>
        <Default>
          <HTML><![CDATA[ISBN&nbsp;]]></HTML>
          <Column HTMLEncode="TRUE"/>
        </Default>
      </Switch>
    </RenderPattern>
    

    DisplayPattern 型のこの RenderPattern 要素は、表示モードでリスト ビューにフィールドをレンダリングします。Column 要素によって表されるフィールド値が空の文字列の場合は、何も実行されません。フィールドに値が含まれている場合は、"ISBN" という単語がレンダリングされ、続いてスペースとフィールド値がレンダリングされます。リスト ビュー モードの列見出しは、ユーザー設定フィールド型が親 "Text" フィールド型から継承する HeaderPattern 型の RenderPattern によってレンダリングされます (レンダリング パターンの詳細については、「RenderPattern 要素 (フィールド型)」を参照してください)。

警告

Windows SharePoint Services 3.0 ツールである Visual Studio 2005 Extensions の Version 1.0 を使用している場合は、Visual Studio の [ビルド] メニューの [配置] オプションは使用しないでください。このオプションを使用すると、作成したファイルの代わりに簡素化された fldtypes*.xml ファイルが配置されます。この簡素化されたバージョンには、カスタムの RenderPattern テンプレートは格納されません。

ユーザー設定フィールド型をビルドしてテストする

ユーザー設定フィールド型をビルドしてテストするには

  1. [ビルド] メニューの [リビルド] をクリックします。以前に作成したビルド後のコマンドによって、さまざまなファイルが必要な場所に自動的にコピーされます。

  2. SharePoint Web アプリケーションで Web サイトを開き、"Books" というリストを作成します。

  3. 新しい列をリストに追加します。[列の作成] ページで、列名として「ISBN」と入力します。

  4. [ISBN for a book] に対応するオプション ボタンをクリックします。

  5. [はい] をクリックして、フィールドを必須にします。

  6. [既定のビューに追加] チェック ボックスはオンのままにしておきます。

  7. [OK] をクリックします。

  8. アイテムをリストに追加します。

  9. [新しいアイテム] ページで、フィールドの初期値が既定値の "0-000-00000-0" に設定されていることを確認します。

  10. 無効な ISBN 値を入力して、アイテムを保存しようとしたときにどのようなエラーが発生するかどうかを確認します。

  11. フィールドを完全に空のままにした場合に、どのようなことが起こるかどうかを確認します。

  12. 最後に、「0-262-61108-2」と入力するか、有効であることがわかっている別の値を入力し、[OK] をクリックします (有効な ISBN に対してエラーが発生した場合は、値の末尾にスペースが入っていないかどうかを確認してください)。

  13. リスト ビューの値の前に "ISBN" とスペースが入っていることを確認します。

  14. アイテムのタイトルをクリックして、表示ページを開きます。リスト ビューの場合と同様に、フィールドがレンダリングされていることを確認します。

  15. [アイテムの編集] をクリックして、フィールドを編集します。フィールドの初期値が、既定値ではなく現在の値に設定されていることを確認します。

  16. フィールド値を無効な値に変更し、新規モードの場合と同様に編集モードでも検証エラーが表示されることを確認します。

モバイル デバイス向けフィールド レンダリングとコンピュータ向けフィールド レンダリングの違い

Windows SharePoint Services 3.0 では、モバイル デバイス用のユーザー設定フィールド レンダリング コントロールを使用したフィールド レンダリングは、コンピュータ用のユーザー設定フィールド レンダリング コントロールを使用したフィールド レンダリングに似ています。ただし、次の違いに注意してください。

  • モバイル ページは、コンピュータのブラウザ用に設計されている Windows SharePoint Services サイトのメイン ページとはまったく異なるページ セットであり、RenderingTemplate オブジェクトの別のセットを参照します。

  • モバイルの RenderingTemplate オブジェクトは、DefaultTemplates.ascx ではなく、MobileDefaultTemplates.ascx で宣言されます。

  • モバイルのフィールド レンダリング コントロールは、Microsoft.SharePoint.MobileControls という独自の名前空間を持ち、ASP.NET の System.Web.UI.WebControls 名前空間ではなく、System.Web.UI.MobileControls 名前空間のクラスから派生します。

  • モバイルのフィールド レンダリング コントロールの継承階層は、標準のフィールド レンダリング コントロールの継承階層とは若干異なります。たとえば、標準のフィールド レンダリングの TemplateBasedControlFormComponent の機能は、SPMobileComponent クラスに組み込まれています。

  • モバイル コンテキスト用に作成したユーザー設定フィールド レンダリング コントロールは、コンピュータのブラウザ用に作成したユーザー設定フィールド レンダリング コントロールの場合と比べ、フィールドをレンダリングするときに、コントロールの CreateChildControls メソッドへの依存度が高く、その分レンダリング テンプレートへの依存度は低くなります。また、モバイルのユーザー設定レンダリング コントロールを開発するときには、CreateChildControls メソッド自体をオーバーライドすることはあまりありません。代わりに、モバイルのユーザー設定レンダリング コントロールでは、CreateChildControls メソッドによって呼び出される次の 4 つのメソッドの中から 1 つ以上のメソッドをオーバーライドするのが一般的です。

Next Steps

ユーザー設定フィールド型を十分にテストしたら、実稼働サーバーに容易に展開できるように、Windows SharePoint Services 3.0 ソリューションを Visual Studio プロジェクトに追加します。詳細については、「ソリューションの概要」を参照してください。

See Also

参照

Field Rendering Templates

FieldTypes 要素 (フィールド型)

FieldType 要素 (フィールド型)

Field 要素 (フィールド型)

Namespace Naming Guidelines

RenderPattern 要素 (フィールド型)

AlternateTemplateName

BaseValidator

ControlTemplate

CreateChildControls

DefaultAlternateTemplateName

DefaultTemplateName

EnsureChildControls

FieldRenderingControl

GetValidatedString

ItemFieldValue

Label

OnLoad()

RegularExpressions

RenderingTemplate

SPControlMode

SPFieldText

SPFieldValidationException

Template

TemplateName

TextBox

TextField

ValidationRule

Value

概念

ユーザー設定フィールドクラス

ユーザー設定フィールド型の定義

ユーザー設定フィールド型の展開

ユーザー設定フィールド データ入力規則

フィールド レンダリング コントロール

カスタム フィールド レンダリングのパターン

ソリューションの概要