Вот что я делаю:
на странице 'host' с WebPartManager в ней, переопределяем событие OnPreRender () и создаем переменную Session, уникальную для каждого UC / Wp.Я префикс мой с UI_.
Итак,
protected override void OnPreRender( EventArgs e )
{
base.OnPreRender( e );
WebPartZoneCollection Zones = WebPartManager1.Zones;
foreach ( WebPartZone z in Zones )
{
foreach ( WebPart wp in z.WebParts )
{
Control cntrl;
// get the Control / Webpart
cntrl = wp.Controls[0];
// Initialise a Session variable with the ChromeState of the control.
Session["UI_" + cntrl.ClientID] = wp.ChromeState;
}
}
}
Это должно быть сделано с помощью WebPartManager.
Теперь, внутри каждого UserControl / Webpart, его переопределенный OnPreRender можетвыберите ChromeState из уникальной переменной Session, относящейся к идентификатору клиента UserControl.
protected override void OnPreRender( EventArgs e )
{
base.OnPreRender( e );
PartChromeState pcs = PartChromeState.Minimized;
try
{
pcs = (PartChromeState)Session["UI_" + this.ClientID];
}
catch
{
Session["UI_" + this.ClientID] = pcs;
}
bool canRefresh = pcs == PartChromeState.Normal;
if ( canRefresh )
getData(); // do work only if WP/UC is visible and not 'minimised' or Closed.
}
Причиной попытки / улова является возвращение на страницу с закрытым UC / Wp, сеанса не будетvar устанавливается WebPartManager, поэтому Session будет нулевым.Может быть, есть способ заставить WebPartManager узнать, какие WP / UC были закрыты, но у меня не хватило времени копаться!
В любом случае, в результате любой Webpart / UC был закрыт или свернутне будет попадать в базу данных (или делать что-либо еще), что приведет к гораздо более быстрому «рабочему столу» веб-части.
Я рассматриваю возможность добавления более сложного объекта в переменную Session вместе с его ChromeState (чтобы кэшировать диаграмму)Например, и т. д.), но ключ к этому - настроить состояние конфигурации WebPartManager, поскольку оно само «знает» состояние, в котором находятся UC / Wps!
Надеюсь, это поможет
C