SharePointの概要
Microsoft Office SharePoint Server(MOSS)は、組織内のコミュニケーションやコラボレーションを促進する、強力なWebベースのポータルパッケージです。
MOSSを使用すると、Webパーツフレームワークを通してWebアプリケーションを素早く構築することができます。Webパーツはパッケージされたコンポーネントになっており、ページに組み込むと、データの視覚化やデータ入力補助といった機能をアプリケーションに追加します。
この記事では、NetAdvantage for ASP.NETのリッチなコントロールを活用して、MOSS上でのWebパーツ作成をスムーズに行う方法を説明します。
SharePointの要件
MOSS Webパーツページでは、すべてのコンポーネントはWebPart
基本クラスから派生する必要があります。一方、NetAdvantage for ASP.NETコントロールは、コアのASP.NET基本クラスであるWebControl
から派生しています。
この不一致のため、NetAdvantage for ASP.NETコントロールはWebパーツページに直接追加することができません。
SharePointのWebパーツとしてNetAdvantage for ASP.NETを組み込む
この問題の解決方法は、WebControl
を複合Webパーツにラップすることです。これにより、通常のASP.NETコントロールでもSharePoint Webパーツページの世界に持ってくることができます。
「複合Webパーツ」は、複数の一般的なWebControl
をホストするシンプルな入れ物です。モジュール化とパーソナライズ性を特徴とするWebパーツフレームワークの世界に、さらに標準的なWebControlがもつ機能性と再利用性をもたらします。
このように、一つまたは複数のNetAdvantage for ASP.NET Webコントロールを中心にWebパーツの入れ物を作成するのは簡単です。ユーザーのニーズによって、ラッパーをシンプルにすることも高度にすることもできます。
より高度なラッパーの場合、エンドユーザーがカスタマイズできるように、パブリックプロパティをWebパーツに追加することができます。さらに一歩進めて、データバインディングやドリルダウンのシナリオを実現するコネクションポイントの追加さえできます。
以下の例では、このうち基本、すなわちシンプルな入れ物を対象として話を進めます。
実装
作業を開始するには、派生元にしたい基本クラスを決定する必要があります。
以前のバージョンのMicrosoft Office SharePointでは、Webパーツが派生できるのはSharePointアセンブリで定義されたSharePoint WebPart
クラスからに限定されていました。Windows SharePoint Services 3.0(WSS)は.NET Framework 2.0の最上部に構築されるので、.NET FrameworkのWebPart
クラスをもとに派生することが可能となりました。
.NET Framework WebPart
基本クラスの使用が推奨されますが、SharePointWebPart
クラスの使用を検討してもよいと思われる理由がいくつかあります。詳細はMSDNの記事を参照してください。
本稿ではSharePointで定義したWebPart
クラスを使用します。これによって、以前のバージョンのWSSと後方互換性を確保することができます。
Webパーツの作成
使用する基本クラスを決定したら、Visual Studio 2005を使用して新しいC#またはVB.NETクラスライブラリプロジェクトを作成します。以下のMSDNトピックを使用して作業を開始できます。
上記の「Hello World」スタイルの記事では、コントロールのRender
メソッドのオーバーライドが拡張性モデルとして使用されましたが、複合Webパーツを作成する際には、レンダリング処理などの作業を子コントロールに分担することができます。そのため、必ずしもRender
メソッドをオーバーライドする必要がなくなる代わりに、WebPartのControlsコレクション内に作成されたコンポジションモデルに依存することになります。
WebPartのControlsコレクションに、NetAdvantageのWebGridなどフル機能を持ち合わせたASP.NETコントロールを追加することによって、図1のように追加作業なしで出力を自動的にレンダリングします。
using igGrid = Infragistics.WebUI.UltraWebGrid; using igGauge = Infragistics.WebUI.UltraWebGauge; // ……(略)…… private igGrid.UltraWebGrid _Grid; private igGrid.UltraWebGrid Grid { get { this.EnsureChiidControls(); return this._Grid; } } private igGauge.UltraGauge _Gauge; private igGauge.UltraGauge Gauge { get { this.EnsureChildControls(); return this._Gauge; } } protected override void CreateChildControls() { base.CreateChildControls(); //create our composites this._Gauge = new igGauge.UltraGauge(); this._Gauge.ID = "Gauge"; this._Grid = new igGrid.UltraWebGrid("Grid"); //add composites to controls collection //this is the most important piece this.Controls.Add(this._Gauge); this.Controls.Add(this._Grid); }
上記のコードでは、WebGrid
およびWebGauge
を作成し、それらをカスタムのパーツのControls
コレクションに追加しています。CreateChildControls
は基本コントロールフレームワークによって自動的に呼び出されるメソッドで、EnsureChildControls
メソッドによって一度だけ呼び出されることが保証されます。子コントロールから起動したイベントが正しく発生することを保証するために、WebPart
クラスのOnInit
メソッド内からEnsureChildControls
を呼び出すことを推奨します。