モバイル ページのカスタム フィールド レンダリング コントロールを作成する

最終更新日: 2011年2月2日

適用対象: SharePoint Foundation 2010

このチュートリアルでは、RenderingTemplate オブジェクトと一緒にカスタム フィールド レンダリング コントロールを実装することにより、モバイル ページでフィールド レンダリングをカスタマイズする方法について説明します。サンプルの手順では、モバイル表示アイテム、新規作成アイテム、編集アイテムの各ページに表示される Announcements リストのアイテムの Title フィールドをカスタマイズする方法について示します。カスタマイズは、次の 3 種類のページそれぞれにおいて異なります。

  • 表示フォーム - 検索リンクを追加します。ユーザーはここから Bing を使用して、インターネットでお知らせタイトルを検索できます。

  • 編集フォーム - Expires 列の値が現在の日付より前であるときは、既定のテキストを追加します。

  • 新規作成フォーム - 値の特定の形式をユーザーに表示する既定のテキストを追加します。

モバイル ページのフィールドをカスタマイズする際の手順の概要については、「[方法] モバイル ページでフィールド レンダリングをカスタマイズする」を参照してください。

前提条件

少なくとも次のどちらかの操作を行います。

推奨: 「[チュートリアル] モバイル フォームのアイテムのタイトルをカスタマイズする」に記載されているチュートリアルを完了します。

カスタム フィールド プロジェクトをセットアップするには

  1. Visual Studio で、空の SharePoint プロジェクトを作成し、そのプロジェクトをサンドボックス ソリューションではなくファーム ソリューションにして、MobileItemTitleField という名前を付けます。

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

  3. [プロパティ] ダイアログ ボックスの [アプリケーション] タブで、[アセンブリ名] に「Contoso.SharePoint.MobileControls.ItemTitleField」、[既定の名前空間] に「Contoso.SharePoint.MobileControls」と入力します。[対象とする Framework] は .NET Framework 3.5 のままにしておきます。

  4. Visual Studio の [標準メニュー] の [ソリューション プラットフォーム] ボックスに "Any CPU" または "x64" と表示されていない場合は、[ビルド] タブを開いて、[プラットフォーム ターゲット] を "Any CPU" または "x64" のどちらかに設定します。この選択については、「[方法] 適切なターゲット フレームワークおよび CPU を設定する」を参照してください。

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

  6. ソリューション エクスプローラーでプロジェクトを右クリックし、[追加] をポイントして、[新しいアイテム] を選択します。

  7. [新しいアイテムの追加] ダイアログ ボックスの [インストールされているテンプレート] ツリーで、[Visual C#] を選択し、[コード] を選択します。

  8. [テンプレート] ボックスで [クラス] を選択し、[名前] ボックスに「ItemTitleField.cs」と入力して、[追加] をクリックします。

  9. ソリューション エクスプローラーで [参照設定] ノードを右クリックし、[参照の追加] をクリックします。[参照の追加] ダイアログボックスの [.NET] タブで、Ctrl キーを押しながら [System.Web] と [System.Web.Mobile] を選択します。[OK] をクリックします。

  10. ソリューション エクスプローラーでプロジェクト名を右クリックし、[追加] をポイントして、[SharePoint のマップされたフォルダー] を選択します。

  11. 表示されたツリー コントロールを使用してフォルダーを TEMPLATE\ControlTemplates にマップし、[OK] をクリックします。

  12. ソリューション エクスプローラーで、プロジェクト名ではなく [ControlTemplates] フォルダーを右クリックし、[追加] をポイントして、[新しいアイテム] を選択します。

  13. [新しいアイテムの追加] ダイアログ ボックスの [インストールされているテンプレート] ツリーで、[SharePoint] を選択し、[2010] を選択します。

  14. [テンプレート] ボックスで SharePoint の [ユーザー コントロール] を選択し, .ascx ファイルに「AnnouncementsItemTitleField.ascx」という名前を付けて、[追加] をクリックします。Visual Studio によって、ファイルが自動的に SharePoint ソリューション マニフェストに追加され、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates に展開されるように設定されます。また、アセンブリがマニフェストに追加され、グローバル アセンブリ キャッシュ (GAC) に展開されるように設定されます。

    ヒントヒント

    ソリューション エクスプローラーでプロジェクト名を右クリックしてユーザー コントロールを追加しないでください。この方法でユーザー コントロールを追加すると、Visual Studio は、そのコントロールを TEMPLATE\ControlTemplates のサブフォルダーに追加します。その後、Visual Studio は、移動されなかったコントロールを、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates の対応するサブフォルダーに展開します。サブフォルダー内のモバイル版のレンダリング テンプレートは読み込まれません。

  15. AnnouncementsItemTitleField.ascx ファイルの下に自動的に作成された AnnouncementsItemTitleField.ascx.cs および AnnouncementsItemTitleField.ascx.designer.cs ファイルを削除します。これらのファイルはこのプロジェクトでは必要ありません。AnnouncementsItemTitleField.ascx の既定のコンテンツは、削除した AnnouncementsItemTitleField.ascx.cs ファイルを参照するので、ファイルが見つからないことを示す警告がコンパイラによって表示されます。既定のコンテンツはこのトピックの後の手順で変更するので、この警告は無視してください。

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

  1. プロジェクトの ItemTitleField.cs ファイルがまだ開いていない場合は開き、次の using ステートメントを追加します。

    using System.Web.UI.MobileControls;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.MobileControls;
    
  2. public アクセス修飾子を ItemTitleField 宣言に追加し (このアクセス修飾子がない場合)、宣言を変更して、SPMobileBaseTextField から継承することを指定します。

    public class ItemTitleField : SPMobileBaseTextField
    {
    
    }
    
  3. CreateControlForDisplay() メソッドの次のオーバーライドを追加します。

    protected override MobileControl CreateControlForDisplay()
    {
       string title = Convert.ToString(this.ItemFieldValue);
       if (!String.IsNullOrEmpty(title))
       {
          this.LabelControl.BreakAfter = false;
          this.LabelControl.Text = title + " ";
    
          this.LinkControl.BreakAfter = false;
          this.LinkControl.Text = "Search";
          this.LinkControl.href = "https://www.bing.com/search?q=" + title.Replace(' ', '+');
    
          Panel panel = new Panel();
          panel.BreakAfter = false;
          panel.Controls.Add(this.LabelControl);
          panel.Controls.Add(this.LinkControl);
    
          return panel;
       }
       return null;
    }
    

    現在のリスト アイテムの [タイトル] フィールドの現在の値を取得することで、このメソッドが開始されることに注意してください。現在の値は、ItemFieldValue プロパティに格納されています。

  4. CreateControlForNew メソッドの次のオーバーライドを追加します。

    protected override MobileControl CreateControlForNew()
    {
       MobileControl myNewControl = null;
       if (this.Field != null)
       {
          string text = "Group: Project Name";
          if (!this.Page.IsPostBack)
          {
             this.TextBoxControl.Text = text;
          }
          myNewControl = this.TextBoxControl;
       }
       return myNewControl;
    }
    
  5. CreateControlForEdit メソッドの次のオーバーライドを追加します。

    protected override MobileControl CreateControlForEdit()
    {
       MobileControl myEditControl = null;
       if (this.Item != null && this.Field != null)
       {
          if (this.NeedEllipsisRendering)
          {
             myEditControl = this.CreateControlForDisplay();
          }
          else
          {
             if (!this.Page.IsPostBack)
             {
                string strEdit = this.Field.GetFieldValueForEdit(this.ItemFieldValue);
                string overDue = "OVERDUE: ";
    
                SPListItem item = this.ListItem;
                if (item["Expires"] != null)
                {
                   System.DateTime date = (DateTime)item["Expires"];
                   if (date.CompareTo(System.DateTime.Today) < 0)
                   {
                      this.TextBoxControl.Text = overDue + strEdit;
                   }
                   else
                   {
                      this.TextBoxControl.Text = strEdit;
                   }
                }
             }
             myEditControl = this.TextBoxControl;
          }
       }
       return myEditControl;
    }
    

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

  1. AnnouncementsItemTitleField.ascx ファイルを開き、ディレクティブ セクション全体を次のマークアップで置き換えます。

    <%@ Register TagPrefix="GroupBoardMobile"   Namespace="Microsoft.SharePoint.Applications.GroupBoard.MobileControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ Control Language="C#"   %> 
    <%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
    <%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %> 
    <%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
    <%@ Register TagPrefix="SPMobile" Namespace="Microsoft.SharePoint.MobileControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
    <%@ Register TagPrefix="WPMobile" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    
  2. 次のコードを使用して、タグ プレフィックス登録を追加します。

    <%@ Register TagPrefix="Contoso" Namespace="Contoso.SharePoint.MobileControls" Assembly="$SharePoint.Project.AssemblyFullName$" %> 
    

    プロジェクトの構築時に、Visual Studio のトークン $SharePoint.Project.AssemblyFullName$ が、4 つの部分で構成されるアセンブリ名に置き換えられます。

  3. Microsoft.SharePoint 名前空間の Import ディレクティブを追加します。

    <%@ Import Namespace="Microsoft.SharePoint" %>
    
  4. ディレクティブの下に RenderingTemplate を追加し、これに、ランタイムが検索する ID (MobileCustomListField_Announcements_Text_Title) を指定します。

    <SharePoint:RenderingTemplate RunAt="Server" ID="MobileCustomListField_Announcements_Text_Title" >
    
    </SharePoint:RenderingTemplate>
    
  5. RenderingTemplate 要素内で、カスタマイズされた ItemTitleField オブジェクトを子コントロールとして持っている Template 要素を定義します。

    <Template>
      <Contoso:ItemTitleField RunAt="Server" />
    </Template>
    

    このファイルが、「[チュートリアル] モバイル フォームのアイテムのタイトルをカスタマイズする」で作成したファイルとほぼ一致することに注目してください。違いは以下のとおりです。

    • "Contoso" タグ プレフィックスを登録するために新しい Register ディレクティブが追加されています。

    • Microsoft.SharePoint 名前空間をインポートする行が追加されています。

    • 次の行が [チュートリアル] モバイル フォームのアイテムのタイトルをカスタマイズする に存在します。

      <mobile:Label Text="Title field in Announcements List" RunAt="Server" />

      この行が、このトピックのコード例では以下の行で置き換えられています。

      <Contoso:ItemTitleField RunAt="Server" />

      これにより、レンダリング テンプレートが、このチュートリアルの前半で作成したフィールド レンダリング コントロールを呼び出すことができます。

  6. [ビルド] メニューで [ソリューションの展開] を選択します。これにより、アセンブリが自動的にリビルドされ, .ascx ファイルが保存されます。また、アセンブリはグローバル アセンブリ キャッシュに展開され, .ascx ファイルは %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATES\ControlTemplates に展開されて、Web アプリケーションが再利用されます。

レンダリング コントロールのテスト

モバイル デバイスまたはエミュレーターを使用して、Web アプリケーション内のお知らせリストを含む Web サイトにアクセスします。お知らせリストにアクセスします。[新しいアイテム] リンクをクリックします。図 1 のように表示されます。

図 1. 新しいフォームの [タイトル] フィールドに対して指定した既定のテキスト

カスタマイズされたモバイルの新規アイテム フォーム

新しいアイテムを作成し、そのアイテムに過去の日付の Expires 値を設定します。[保存] をクリックします。これにより、リスト ビューに戻ります。クリックして新しいアイテムを表示します。図 2 のように表示されます。[検索] リンクがタイトルの最後に追加されています。

図 2. [表示] フォームに追加された [検索] リンク

カスタマイズされたモバイルのアイテム表示フォーム

[編集] リンクをクリックします。図 3 のように表示されます。"期限日" が現在のタイトルに追加されています。

図 3. [編集] フォームの [タイトル] フィールドにおけるテキストの条件付きレンダリング

カスタマイズされたモバイルのアイテム編集フォーム

関連項目

タスク

[方法] モバイル ページでフィールド レンダリングをカスタマイズする

概念

モバイル ページのレイアウトと改ページ

モバイル ページのレンダリング システム