ASP.NET中的Web部件:页面上保留的Openpart和Closed Webpart之间的区别

时间:2012-02-14 14:56:43

标签: asp.net web-parts

我的页面上有两个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)

3 个答案:

答案 0 :(得分:1)

  

这是我的问题:我只想加载那些小工具(UC)   未被用户关闭,即在webpart页面时可见   负载。我无法找到页面上保留的webpart之间的区别   但不可见,网页保留在页面上并且可见

当用户关闭窗口或移动到另一个页面时,您可以使用以下代码检查控件的可见性...

var ID = document.getElementById('ID of the control');

此代码将以OnBeforeUnLoad事件

编写

<强>参考

OnBeforeUnload event of Javascript


如果此ID返回您的内存,则表示存在控件,否则它将被隐藏,并且控件不会呈现为HTML。


现在您可以使用AJAX / JQuery调用服务器方法。此方法将更新数据库中的控件可见性位(高/低)或您想要的位置....

希望这会对你有帮助......


<强>查询

关闭控制意味着设置

  1. 样式显示 - 无
  2. visibility = false
  3. 未加载控件

答案 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