WebパーツAがWebパーツBへの参照を取得し、パブリック/内部メソッド/プロパティを呼び出したり、ハンドラーをパブリック/内部イベントにサブスクライブしたりすることに問題はありません。ただし、これを行う際の注意点の 1 つは、EnsureChildControls です。私は自分の目で、ある Web パーツが PreRender に対してクリアに実行されているのを目撃しましたが、別の Web パーツは CreateChildControls を実行していませんでした。
Web パーツ A から、次のように Web パーツ B への参照をフェッチします (この場合、Web パーツ B は Calendar 型です)。
private Calendar _calendarWP = null;
public Calendar CalendarWP
{
get
{
if (_calendarWP != null)
return _calendarWP;
else
foreach (System.Web.UI.WebControls.WebParts.WebPartZone zone in this.WebPartManager.Zones)
foreach (System.Web.UI.WebControls.WebParts.WebPart webpart in zone.WebParts)
if (webpart is Calendar)
{
_calendarWP = (Calendar)webpart;
_calendarWP.EnsureChildControls();
return _calendarWP;
}
return null;
}
}
これで、次のように、新しいデータを取得してカレンダーを更新することができます。
IEnumerable newData = SomeDataProvider.GetNewData(args);
CalendarWP.someGridView.DataSource = newData;
CalendarWP.someGridView.DataBind();
または、Web パーツ A が自身への参照を Web パーツ B に投げて、Web パーツ A のパブリック/内部プロパティを使用して自身のデータを取得できるようにすることもできます。
CalendarWP.UseWPAToFetchData(this);