我的页面上有两个Webpartzones,方式如下:
<asp:WebPartZone ID="Left" WebPartVerbRenderMode="TitleBar" runat="server" CssClass="PartZone" >
<MinimizeVerb Text="Minimize" Enabled="true" />
<RestoreVerb Text="Restore" Enabled="true" />
<CloseVerb Text="Close" Enabled="true" />
<ZoneTemplate>
<REAMS:TotoalEnergyGenerated runat="server" ID="TotEneryGen" />
<REAMS:NoOfSystemsOnline runat="server" ID="OnlineSys" />
<REAMS:WeatherInfo Title=" " ID="WeatherInfoExec" runat="server" />
<REAMS:AssetMap ID="AssetMapExec" runat="server" />
</ZoneTemplate>
</asp:WebPartZone>
<asp:WebPartZone ID="Bottom" WebPartVerbRenderMode="TitleBar" runat="server" CssClass="PartZone" >
<MinimizeVerb Text="Minimize" Enabled="true" />
<RestoreVerb Text="Restore" Enabled="true" />
<CloseVerb Text="Close" Enabled="true" />
<ZoneTemplate>
<REAMS:ProjectSummary ID="Project" runat="server" />
</ZoneTemplate>
</asp:WebPartZone>
很明显,webpartzone left
中有四个小工具(控件),而webpartzone bottom
有一个。因此,对于任何给定用户,左侧显示四个,bottom
显示一个小工具。现在,假设用户关闭了4个小工具中的一个,现在left
只有三个小工具。下次他来,并根据他以前的修改找到页面布局。
我将这些小工具作为UserControls。这些用户控件有公共方法来命中数据库并执行一些逻辑并获取数据,我在webpart页面上调用这些公共方法(而不是在uc本身上)。即ucGadget1.LoadData();
这是我的问题:我只想加载那些未被用户关闭的小工具(UC),即加载webpart页面时可见的小工具。 我无法找到保留在页面上但不可见的webpart与页面上保留的webpart并且可见的区别。因为这些webpart的所有属性都是在设计器上编写的。我需要那些在运行时(以及通过ASP.NET个性化表)呈现的属性
(请考虑gadget = webpart)
答案 0 :(得分:1)
这是我的问题:我只想加载那些小工具(UC) 未被用户关闭,即在webpart页面时可见 负载。我无法找到页面上保留的webpart之间的区别 但不可见,网页保留在页面上并且可见
当用户关闭窗口或移动到另一个页面时,您可以使用以下代码检查控件的可见性...
var ID = document.getElementById('ID of the control');
此代码将以OnBeforeUnLoad
事件
<强>参考强>
OnBeforeUnload event of Javascript
如果此ID返回您的内存,则表示存在控件,否则它将被隐藏,并且控件不会呈现为HTML。
现在您可以使用AJAX / JQuery调用服务器方法。此方法将更新数据库中的控件可见性位(高/低)或您想要的位置....
希望这会对你有帮助......
<强>查询强>
关闭控制意味着设置
答案 1 :(得分:0)
OnLoadComplete中提供了页面上任何webpart的用户设置属性。所以我这样做了
protected override void OnLoadComplete(EventArgs e)
{
base.OnLoadComplete(e);
foreach (WebPart webprt in WebPartManagerDashBoard.WebParts)
{
if (!webprt.IsClosed)
{
//Action
}
}
}
现在可以实现自定义逻辑而不是// Action。很少有WebPartManager事件也可以根据用途进行处理。
WebPartManagerDashBoard.WebPartClosing += new WebPartCancelEventHandler(WebPartManagerDashBoard_WebPartClosing);
答案 2 :(得分:0)
这就是我的所作所为:
在其中包含WebPartManager的“主机”页面中,覆盖OnPreRender()事件并创建每个UC / Wp唯一的Session变量。我用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可以从与usercontrol的ClientID相关的唯一命名的Session var中获取ChromeState。
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.
}
try / catch的原因是返回到UC / Wp'关闭'的页面时,WebPartManager不会设置Session var,因此Session将为null。可能有一种方法可以让WebPartManager找出WP / UC已被关闭但我没时间挖掘了!
无论如何,结果是任何已关闭或最小化的Webpart / UC都不会访问数据库(或做任何事情),从而导致Webpart'桌面更加快捷。
我正在考虑将更复杂的对象与其ChromeState一起放入Session var(以便缓存图表等等),但关键是要让WebPartManager配置状态,因为它单独“知道”了声明UC / Wps在!
希望这有帮助
C