SharePointのリストの取得や更新を行うWebパーツの作成
まず、Visual Studio 2010を使用してSharePoint 2010のWebパーツを作成してみましょう。
サンプルの概要
SharePointサイトに含まれる「お知らせ」リストの取得や更新を行うWebパーツを作成します(図1)。データアクセスには、LINQ to SharePointを使用します。
サンプルの作成
では、実際にサンプルを作成してみましょう。以下の手順で作成します。
[1]新しいプロジェクトを作成する
SharePoint 2010のWebパーツ用の新しいプロジェクトを作成します。
まず、管理者権限でVisual Studio 2010を起動します。これは、配置の際などVisual StudioからSharePointサーバーにアクセスするためには、管理者権限が必要となるためです。
次に、[新しいプロジェクト]ダイアログボックス中で、[インストールされたテンプレート]から[Visual C#]-[SharePoint]-[2010]を選択し、右側のテンプレートの一覧から[視覚的Webパーツ]を選択します。プロジェクト名には「VisualWebPartProjectSample」と入力し、[OK]ボタンをクリックします(図2)。
すると、[SharePoint カスタマイズウィザード]が表示されます。
ここでは、ファームソリューションしか選択できないようになっていますが、SharePointソリューションの信頼レベルとしては、サンドボックスソリューションというもう1つの選択肢もあります。ファームソリューションは、IISワーカープロセスで実行されるのに対し、サンドボックスソリューションでは、SharePointユーザーコードソリューションワーカープロセスと呼ばれるIISワーカープロセスとは別のプロセス上で実行されるため、IISの再起動を行う必要がありません。サンドボックスソリューションのセキュリティ上の制限として、サーバー環境全体に影響を与えないよう、特定の機能のみにアクセスできます。
サンドボックスソリューションによるWebパーツの作成も可能ですが、「視覚的Webパーツ」プロジェクトテンプレートを使用したWebパーツ作成時には、ファームソリューションしか選択できません。
ここで、使用するSharePointサイトのURLを入力し、[完了]ボタンをクリックします(図3)。
SharePoint 2010のWebパーツ用の新しいプロジェクトが作成されます。ソリューションエクスプローラーで確認すると、図4のようなソリューション構成となっています。[VisualWebPart1]という名前のWebパーツ用フォルダー内に、[VisualWebPart1UserControl.ascx]という名前のユーザーコントロールが作成されていることが分かります。
[2]LINQ to SharePoint用クラスを生成する
SharePoint 2010に付属しているSPMetalというコマンドラインのツールを使用して、LINQ to SharePointのためのクラスを生成します。
Windowsの[スタート]メニューから、[すべてのプログラム]-[Microsoft SharePoint 2010 Products]内の[SharePoint 2010 管理シェル]を起動します。
管理シェル内で、次のSPMetalコマンドを実行します。
spmetal.exe /web:http://yhirose-pc /namespace:VisualWebPartProjectSample.VisualWebPart1 /code:SampleDC.cs
/webオプションには、SharePointサイトのURLを指定します。/namespaceオプションには、生成されるクラスの名前空間を、/codeオプションには、出力ファイル名を指定します。これで、SharePointサイトのデータをLINQで操作するためのデータコンテキストやエンティティのクラスが生成されます。
SPMetalコマンドには他にもいくつかのオプションを指定できます。詳細は、MSDNライブラリの「SPMetal」のページを参照してください。
[3]生成されたクラスをプロジェクトに追加する
手順[2]で生成されたLINQ to SharePoint用クラスをプロジェクトに追加します。
ソリューションエクスプローラーで、[VisualWebPart1]を右クリックし、[追加]-[既存の項目]をクリックします。表示された[既存項目の追加]ダイアログで、手順[2]で生成されたSampleDC.csファイルを選択し、[追加]ボタンをクリックします。
[4]参照設定に、Microsoft.SharePoint.Linqを追加する
手順[3]で追加したLINQ to SharePoint用クラスはそのままだとコンパイルエラーになるため、プロジェクトの参照設定にMicrosoft.SharePoint.Linqを追加する必要があります。
ソリューションエクスプローラーで、[参照設定]を右クリックし、[参照の追加]をクリックします。表示された[参照の追加]ダイアログで、[.NET]タブ内の[Microsoft.SharePoint.Linq]を選択し[OK]ボタンをクリックします(図5)。
[5]ユーザーコントロールの画面をデザインする
ユーザーコントロール(VisualWebPart1UserControl.ascx)の画面デザインを行います。VisualWebPart1UserControl.ascxを[ソース]ビューで開き、自動生成されたWebパーツ用のディレクティブの下に、リスト1のようにコードを追加します(太字部分)。
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %> <%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %> <%@ Import Namespace="Microsoft.SharePoint" %> <%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VisualWebPart1UserControl.ascx.cs" Inherits="VisualWebPartProjectSample.VisualWebPart1.VisualWebPart1UserControl" %> <h3>お知らせ リストへのアクセスサンプル</h3> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> <br /> タイトル <br /> <asp:TextBox ID="TitleTextBox" runat="server"></asp:TextBox> <br /> 本文 <br /> <asp:TextBox ID="BodyTextBox" runat="server" TextMode="MultiLine"></asp:TextBox> <br /> <asp:Button ID="AddButton" runat="server" Text="追加" onclick="AddButton_Click" />
SharePointサイトの「お知らせ」リストを表示するために、GridViewコントロールを配置します。そして、「お知らせ」リストに対するデータ追加用としてTextBoxコントロールを2つ、Buttonコントロールを1つ配置します。
修正後のVisualWebPart1UserControl.ascxを[デザイン]ビューで表示すると、図6のようになります。
[6]ユーザーコントロールのコードを実装する
ユーザーコントロールが動作するように、コードを実装します。
VisualWebPart1UserControl.ascxの[デザイン]ビューで、[追加]ボタン(AddButton)をダブルクリックすると、コードビハインドファイルのVisualWebPart1UserControl.ascx.csが表示され、[追加]ボタンのClickイベントハンドラー(AddButton_Click)が生成されます。
VisualWebPart1UserControl.ascx.csを、リスト2のように修正します。
using System; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; // (1)追加したusingディレクティブ using System.Linq; using Microsoft.SharePoint; namespace VisualWebPartProjectSample.VisualWebPart1 { public partial class VisualWebPart1UserControl : UserControl { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Refresh(); } } private void Refresh() { // (2)データコンテキストの取得 var dc = new SampleDCDataContext(SPContext.Current.Web.Url); // (3)LINQクエリの作成 var query = from o in dc.お知らせ select o; // (4)GridViewコントロールにバインド GridView1.DataSource = query; GridView1.DataBind(); // 入力内容のクリア TitleTextBox.Text = string.Empty; BodyTextBox.Text = string.Empty; } protected void AddButton_Click(object sender, EventArgs e) { // データコンテキストの取得 var dc = new SampleDCDataContext(SPContext.Current.Web.Url); // (5)新規オブジェクトの作成 var o = new お知らせ(); o.タイトル = TitleTextBox.Text; o.本文 = BodyTextBox.Text; // (6)オブジェクトの追加 dc.お知らせ.InsertOnSubmit(o); dc.SubmitChanges(); Refresh(); } } }
(1)では、LINQやSharePoint用クラスライブラリを使用するための2つのusingディレクティブを追加しています。
(2)では、SharePointサイトのアクセスするためのLINQ to SharePointのデータコンテキストを作成しています。SPContext.Current.Web.Urlプロパティにより、現在実行中のSharePointサイトのURLを取得します。SPContextクラスやSPWebクラスは、Microsoft.SharePoint名前空間で定義されているSharePoint用クラスライブラリに含まれています。
(3)で「お知らせ」リスト内の全データを取得するLINQクエリを作成し、(4)でGridViewコントロールに結果をバインドしています。[追加]ボタンのClickイベントハンドラー内の、(5)では「お知らせ」リストの新しいアイテムを作成し、(6)ではアイテムを追加し変更を反映しています。同様の方法で、SharePointサイトに含まれる「予定表」や「タスク」などの他のリストにも簡単にアクセスできます。
これで、サンプルWebパーツが完成しました。