Reza on blogging [MVP]

THIS BLOG HAS MOVED TO: http://blogs.devhorizon.com/reza

Subscriptions

<November 2008>
SuMoTuWeThFrSa
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

News



toronto.sharepoint.camp


Navigation

Post Categories

Other Bloggers

Personal Links

Programmatically resizing IFRAME height

Have you ever tried to use "Page Viewer Webpart" in sharepoint ? There is a big problem setting the height for this webpart when the page, that is loaded in its iframe, varies in height. In some cases scrollbars appear even if the height is set in webpart property. In respond to a client request, I have recently developed a WSS template that contains a web part which iterates through a pre-defined/pre-populated document library, looking  for default.aspx or default.html and renders that page in an IFRAME. I had to dynamically resize the document library in run time according to the height of the page it points to. My solution contains a java script file named "iFrameResizer.js" that is set to be "Content" of my web part and a little bit of code in my web part to link to this script file to my web part.

 

//-----------------------------------------------------------------

//iFrameResizer.js

//-----------------------------------------------------------------

/* This function is used to adjust the iframe height to its content */
function iResizer(iframeID,iframeName)
{

     moz=document.getElementById&&!document.all
     mozHeightOffset=20
    document.getElementById(iframeID).width="100%"
    document.getElementById(iframeID).height=window.frames[iframeName].document.body.scrollHeight+(moz?mozHeightOffset:0)
}

 


Then in the constructor of  web part I added an event handler to the PreRender event that loads “iFrameResizer.js” onto the page on prerendering  :

 

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.WebPartPages;

namespace DevHorizon.Sharepoint.iFrameWP
{
 ///
 /// Description for Frame.
 ///
 [DefaultProperty("Url"),
  ToolboxData("<{0}:Frame runat=server>"),
  XmlRoot(Namespace="DevHorizon.Sharepoint.iFrameWP")]
 public class Frame : WebPart
 {
  private const string defaultUrl = "shared%20documents/default.htm";
  private string url = defaultUrl;

  // Used for the linked script file
  private const string iFrameResizerFileName = "iFrameResizer.js";
  private const string iFrameResizerIncludeScriptKey = "iFrameResizerIncludeScript";
  private const string IncludeScriptFormat =@" language=""{0}"" src=""{1}{2}"">";


 
  [Browsable(true),Category("Miscellaneous"),DefaultValue(defaultUrl),WebPartStorage(Storage.Personal),FriendlyName("Url"),Description("URL Property")]
  public string Url
  {
     get
     {
       return url;
      }

   set
     {
      url = value;
     }
  }

 

  // Contructor
  public Frame()
  {
      this.PreRender += new EventHandler(WebPart_Frame_PreRender);
  }

  //Function which will register the linked file script

 

  private void WebPart_Frame_PreRender(object sender , System.EventArgs e )
  {
       string location = null;
        // Make sure that the script was not already added to the page.
        if (!Page.IsClientScriptBlockRegistered(iFrameResizerIncludeScriptKey))
          {
           location = this.ClassResourcePath + "/";
          // Create the client script block.
          string includeScript = String.Format(IncludeScriptFormat, "javascript", location, iFrameResizerFileName);
          Page.RegisterClientScriptBlock(iFrameResizerIncludeScriptKey, includeScript);
         }

  }

 

  protected override void CreateChildControls()
  {
   Literal lit = new Literal();
   Guid gid=Guid.NewGuid();
   string iframeID="ExxoniFrameWPId" + gid.ToString();
   string iframeName= "ExxoniFrameWPName" + gid.ToString();
   lit.Text = "";

   this.Controls.Add(lit);

  }
 
  protected override void RenderWebPart(HtmlTextWriter output)
  {
      try
       {
          RenderChildren(output);
        }
     //display diagnostic error information if exception occurs
     catch(Exception ex)
      {
        output.Write("

");
        output.Write("Exception Type: " + ex.GetType().ToString() + "
");
        output.Write("Exception Message: " + ex.Message + "

" );
        output.Write("Stack Trace:" + ex.StackTrace.Replace("\n", "
"));
        output.Write("
");
   }

  }
 }
}

 

There is one thing to remember:

I assume that iFrameResizer.js has been already added to the solution as "content" and is deployed to wpresources (or _wpresources if web part is installed in GAC). You have to add the following code to Manifest.xml

posted on Saturday, April 29, 2006 10:11 PM by admin

Powered by Community Server, by Telligent Systems