我认为 webpart A 获取对 webpart B 的引用并调用公共/内部方法/属性或为公共/内部事件订阅处理程序没有任何问题。这样做时要提一点:EnsureChildControls。我亲眼目睹了一个 webpart 对 PreRender 运行清晰,而另一个 webpart 甚至没有运行 CreateChildControls。
从 webpart A,获取您对 webpart B 的引用(在这种情况下,webpart B 是日历类型),如下所示:
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();
或者也许让 webpart A 将对自身的引用扔给 webpart B,以便它可以使用 webpart A 的公共/内部属性为自己获取数据:
CalendarWP.UseWPAToFetchData(this);