【问题标题】:Webparts in ASP.NET: Difference between Open and Closed Webparts kept on the pageASP.NET 中的 Web 部件:页面上保留的打开和关闭 Web 部件之间的区别
【发布时间】:2012-03-05 22:48:26
【问题描述】:

我的页面上有两个 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),即在加载 Web 部件页面时可见的小工具 (UC)。 我无法找到保留在页面上但不可见的 web 部件与保留在页面上且可见的 web 部件之间的区别。因为这些 webpart 的所有属性都是在设计器上编写的。我需要在运行时(并通过 ASP.NET 个性化表)呈现的那些

(请考虑 gadget = webpart)

【问题讨论】:

    标签: asp.net web-parts


    【解决方案1】:

    这是我的问题:我只想加载那些 未由用户关闭,即在 Web 部件页面时可见 负载。我无法找到页面上保留的 webpart 之间的区别 但不可见,并且 Web 部件保留在页面上并且可见

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

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

    这段代码会写在OnBeforeUnLoadEvent中


    参考

    OnBeforeUnload event of Javascript


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


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

    希望对你有所帮助...


    查询

    通过关闭控制意味着设置

    1. 样式显示 - 无
    2. 可见性 = 假
    3. 未加载控件

    ?

    【讨论】:

    • 感谢您的建议 Pankaj。它可以工作,但是有点麻烦。首先,我必须从文档中提取所有表格(最终呈现的 html),然后搜索那些可能是我的 webpart 的表格(因为 webparts 被渲染到表格中),然后是 ajax 请求..所以当你有一个页面时15webparts 和许多未来可能会出现,这种方法是不可取的......请参阅下面我所做的帮助自己......无论如何感谢您的建议。
    【解决方案2】:

    页面上任何 Web 部件的用户集属性都在 OnLoadComplete 中可用。所以我这样做了

     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);
    

    【讨论】:

      【解决方案3】:

      这是我的工作:

      在包含 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 可以从与用户控件的 ClientID 相关的唯一命名的 Session 变量中获取 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 将为空。可能有一种方法可以让 WebPartManager 找出哪些 WP/UC 已关闭,但我没时间挖掘了!

      无论如何,这样做的结果是任何已关闭或最小化的 Webpart/UC 都不会访问数据库(或执行任何操作),从而导致 Webpart 'desk' 更加快捷。

      我正在考虑将一个更复杂的对象与它的 ChromeState 一起放入 Session 变量中(以便缓存图表,例如等),但关键是让 WebPartManager 配置状态,因为它单独“知道”说明 UC/Wps 所在!

      希望对你有帮助

      C

      【讨论】:

        猜你喜欢
        • 2010-11-23
        • 2010-09-13
        • 2016-07-31
        • 2012-03-16
        • 2018-10-07
        • 2011-08-21
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        相关资源
        最近更新 更多