If you tried to create even simple page layouts, you probably noticed the mess Sharepoint creates with tables when placing webpartzones and webparts in the page. While searching about a way to remove completely these tables, I found an interesting solution by David Schneider, which removes tables completely but creates a new whole set of issues with Sharepoint. While the tables are removed around webparts and webpartzones, it breaks functionality of the ribbon in lists and some ajax functionnality on default Sharepoint controls. Not really convenient.

Fortunately, with the help of a colleague, we found a way to remove the tables only on defined webpartzones. Zones marked with a property called tableless=”true” will be stripped from their tables while all other Sharepoint controls won’t be affected at all.

So what needs to be done in order to get this functionnality? Follow these steps:

1) Copy the following modified C# code (notice the tableless property that was added to David Schneider’s solution) in a file called AKS_WebPartZone_Adapter.cs and place it in the AppCode directory under your server root directory (like C:\Inetpub\wwwroot or C:\Inetpub\wwwroot\wss\VirtualDirectories\80).

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.IO;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebPartPages;

/// WebPartZone Adapter
/// Created by David Schneider
/// http://blog.sharepoint.ch
/// Based on AKS

namespace AKSAdapters
{
  public class AKS_WebPartZone_Adapter : System.Web.UI.Adapters.ControlAdapter
  {
      protected override void Render(HtmlTextWriter writer)
      {
          bool inEditMode = false;
          System.Web.UI.WebControls.WebParts.WebPartZone wpz = Control as System.Web.UI.WebControls.WebParts.WebPartZone;
          if (wpz != null && wpz.Attributes["tableless"] != null)
          {
              SPWebPartManager swpm = (SPWebPartManager)SPWebPartManager.GetCurrentWebPartManager(wpz.Page);
              inEditMode = !swpm.GetDisplayMode().AllowPageDesign;
          }
          if (inEditMode)
          {
              // Render the WebPartZone
              writer.Indent++;
              writer.AddAttribute(HtmlTextWriterAttribute.Id, wpz.ID);
              if (!String.IsNullOrEmpty(wpz.CssClass))
              {
                  writer.AddAttribute(HtmlTextWriterAttribute.Class, wpz.CssClass);
              }
              if (wpz.LayoutOrientation == System.Web.UI.WebControls.Orientation.Horizontal)
              {
                  writer.AddAttribute(HtmlTextWriterAttribute.Class, "AspNet-WebPartZone-Horizontal");
              }
              else if (wpz.LayoutOrientation == System.Web.UI.WebControls.Orientation.Vertical)
              {
                  writer.AddAttribute(HtmlTextWriterAttribute.Class, "AspNet-WebPartZone-Vertical");
              }
              writer.RenderBeginTag(HtmlTextWriterTag.Div);
              writer.Indent++;

              // Render the web parts
              if (wpz.WebParts.Count > 0)
              {
                  WebPartCollection wpColl = new WebPartCollection(wpz.WebParts);

                  foreach (System.Web.UI.WebControls.WebParts.WebPart wp in wpColl)
                  {
                      writer.WriteLine();
                      writer.AddAttribute(HtmlTextWriterAttribute.Class, "AspNet-WebPart");
                      writer.RenderBeginTag(HtmlTextWriterTag.Div);

                      wp.RenderControl(writer);
                      writer.RenderEndTag(); // Div
                      writer.Indent++;
                  }
              }
              writer.RenderEndTag(); // Div

              writer.Indent--;
              writer.WriteLine();
          }
          else
          {
              // If we are editing the page --> render the web part as usual.
              base.Render(writer);
          }
      }
  }
}

2) Edit the compat.browser file which in the AppBrowser directory located in your server directory and add the following piece of code after the opening tag:





3) In your page layouts, add the property tableless=”true” to all your WebPartZones.

Your pages will then be free of tables without affecting core Sharepoint functionality such as the ribbon and other editing functions. Enjoy.