Я не вижу ничего плохого в том, что веб-часть A получает ссылку на веб-часть B и вызывает публичные / внутренние методы / свойства или подписывает обработчики на публичные / внутренние события. При этом следует упомянуть один момент: EnsureChildControls. Я видел своими глазами, как одна веб-часть была запущена PreRender, в то время как другая веб-часть даже не запускала CreateChildControls.
Из веб-части A извлеките ссылку на веб-часть B (в данном случае веб-часть 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();
Или, возможно, разрешить веб-части A передавать ссылку на себя веб-части B, чтобы она могла использовать открытые / внутренние свойства веб-части A для извлечения данных для себя:
CalendarWP.UseWPAToFetchData(this);