Click here to Skip to main content
Click here to Skip to main content

ASP.NET Splitter Bar - Resize panels, table cells, and controls

By , 10 Mar 2008
 

Screenshot - VwdCmsSplitterBar.gif

  • Try out the SplitterBar online: SplitterBar Online Demo
  • The VwdCms.SplitterBar now supports both vertical and horizontal orientations

Introduction

The VwdCms.SplitterBar control is designed to give you column resizing in a two-column page layout. Use the splitter bar to resize a panel, div, table cell, or just about any control.

This control is ideal for pages that have a tree or a list of data items that vary in width.

The screenshots at the top of this article are an example of the VwdCms.SplitterBar in use, with a TreeView control in the left column of a table and a TextArea control in the right column. See the demo project (Example 1) for information on the TextArea sizing, scrolling, and text wrapping issue in IE 6 and IE 7, and how to overcome it.

Using the Control

Suggestion: Download the demo project rather than only the code for the control, as the demo project has many examples of how to use the control and how not to use it. The demo project has lots of descriptions and explanations of how to do things, so I won't bother repeating all of that information in this article.

To add the VwdCms.SplitterBar control to your project, just follow these steps:

Step 1: Copy these files into your project directory:

  1. /App_Code/SplitterBar.cs
  2. /VwdCmsSplitterBar.js
  3. /vsplitter.gif

Step 2: Add the VwdCmsSplitterBar.js file to the HEAD section of your Web Form:

<head runat="server">
    <title>VwdCms SplitterBar Web Form</title>
    <script src="VwdCmsSplitterBar.js" type="text/javascript"></script> 
</head>

Step 3: Update your web.config file's Controls section (inside the system.web section):

    <pages>
        <controls>
            <add tagPrefix="VwdCms" namespace="VwdCms"/> 
        </controls>
    </pages>

Step 4: Add a VwdCms.SplitterBar control to your Web Form:

    <VwdCms:SplitterBar runat="server" ID="vsbSplitter1" 
        LeftResizeTargets="tdTree1;divTree1" 
        MinWidth="100" 
        MaxWidth="700"
        BackgroundColor="lightsteelblue" 
        BackgroundColorLimit="firebrick"
        BackgroundColorHilite="steelblue"
        BackgroundColorResizing="purple"
        SaveWidthToElement="txtWidth1"
        OnResizeFunction="splitterOnResize"
        style="background-image:url(vsplitter.gif);
            background-position:center center;
            background-repeat:no-repeat;"/>

An example of the OnResizeFunction:

<script language="javascript" type="text/javascript"><!--

    function splitterOnResize(width)
    {
        // do any other work that needs to happen when the 
        // splitter resizes. this is a good place to handle 
        // any complex resizing rules, etc.

        // make sure the width is in number format
        if (typeof width == "string")
        {
            width = new Number(width.replace("px",""));
        }

        // now do something...
    }
    
// -->
</script>

An example of the table that this VwdCms.SplitterBar is connected to:

    <div style="margin:0px;padding:0px;
    width:800px:overflow:hidden;">
    <table border="0" cellpadding="0" 
        cellspacing="0" 
        style="width:800px;height:200px;
        border:solid 1px #6699CC;">
        <tr style="height:200px;">
            <td id="tdTree1" 
            style="width:250px;height:200px;" 
            align="left" valign="top"> 
              <div id="divTree1" 
                style="width:100%;height:100%;overflow:auto;
                padding:0px;margin:0px;">
                <asp:TreeView ID="tvwFramework1" 
                runat="server" ShowLines="True"
                style="width:100%;height:100%;
                padding:0px;margin:0px;">
                <Nodes>
                <asp:TreeNode Text=".NET Framework" 
                Value=".NET Framework">
                <asp:TreeNode 
                Text="System.Diagnostics" 
                Value="System.Diagnostics">
                <asp:TreeNode 
                Text="Debug Class" 
                Value="Debug"></asp:TreeNode>
                <asp:TreeNode 
                Text="DebuggableAttribute.DebuggingModes 
                Enumeration" 
                Value="DebuggableAttribute.DebuggingModes 
                Enumeration"></asp:TreeNode>
                <asp:TreeNode 
                Text="EventLogPermissionEntryCollection 
                Class" 
                Value="EventLogPermissionEntryCollection 
                Class"></asp:TreeNode>
                </asp:TreeNode>
                </asp:TreeNode>
                </Nodes>
                </asp:TreeView>    
              </div>            
            </td>
            <td id="tdMid1" 
            style="height:200px;width:6px;
            background-color:lightsteelblue;"></td>
            <td id="tdEdit1" 
            align="left" valign="top" 
            style="height:200px;"> 
                    <textarea runat="server" 
                    id="txtEdit1" 
                    style="margin:0px;height:100%;width:100%;
                    padding:0px 0px 0px 5px;
                    border:none;"></textarea>
            </td>
        
        </tr>
    </table>
    <span style="font-family:Verdana:font-size:10pt;">
    Current Width: 
    </span>
    <input type="text" id="txtWidth1" 
    value="250px" 
    style="width:70px;font-family:Verdana:font-size:10pt;"/>
    </div>

More Usage Examples

You can download many other examples of how to use the SplitterBar by clicking the 'Download demo' link at the top of this article.

Points of Interest

The most challenging part about building this control was the JavaScript and DHTML, because I wanted it to work in both IE and Firefox. At first, it seemed like the task would be pretty straightforward, but as I started testing and building the demo project examples, I kept finding little bugs that needed to be addressed. It can become pretty time consuming to hunt down all of these little issues, and I did my best to try to deal with most of them. If you find bugs, feel free to fix them and reply to this article with your suggestions for improvements.

When you try to implement the SplitterBar, you may find that your page is not behaving as you expected. I would like to warn you in advance about this - most of the issues that I found after I completed the control could be addressed by adjusting the CSS styles on the table or controls that I was applying the SplitterBar onto. Many times, our initial reaction is to think that a problem with the column resizing means that there is something wrong with the SplitterBar, and that is certainly possible, but I found that not to be the case most of the time.

The DOCTYPE (markup format specification) that you choose will have a profound impact on how your content is rendered by the browser. If you are having trouble getting styles to work as you expect, you may want to try using a different DOCTYPE. If you are getting strange results or it seems like the browser is ignoring your style settings, it it is interesting and worth the time to try rendering the page with no DOCTYPE at all. Completely remove it from the document, as some browsers, like IE 7, will still pick up the DOCTYPE even if it is commented out.

The demo project Web Forms are using the following DOCTYPE:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

History

I have updated the VwdCms.SplitterBar based on some of the suggestions that you have made. Here is a list of the what has been added or changed:

  • Built in persistence of column width after a postback.
  • Better support for dealing with IFrames.
  • Clean-up of the JavaScript code in VwdCmsSplitterBar.js.
  • More code examples in the demo project including postbacks.
  • Ability to specify how the SplitterBar will handle IFrames.
  • An entire demo page dedicated to IFrames.
  • Double-clicking to minimize and maximize the column width.
  • Changed the OnResizeFunction event to OnResize.
  • Added the OnResizeStart event.
  • Added the OnResizeComplete event.
  • Added the OnDoubleClick event.
  • Added code examples for using the OnResizeStart, OnResize, and OnResizeComplete event handlers in the demo project.
  • Updated to support Master Pages and Container Controls (Naming Containers):
    • C# and JavaScript code work together to determine the ClientID of an element.
    • SplitterBar checks to see if it is in a NamingContainer so it can find the controls during the postback.
    • Added a new example (#7) to the demo project to demonstrate the use of the SplitterBar with Master Pages.
  • Added the link to the SplitterBar online demo.
  • Added a GridView Column Resizing example to the demo project.
  • Added a Horizontal Row Resizing functionality to the SplitterBar, and a new example to the demo project.
  • Added code to account for the window/document scrollLeft and scrollTop so the SplitterBar will continue to work properly when the page has been scrolled down or to the right.
  • Added Example 10 to the demo project - this is an example of using the Vertical and Horizontal Splitter Bars together to create a table with a resizable left column, and in the right column there are two rows which are resizable.
  • Added persistence during postbacks for the MinWidth, MaxWidth, MinHeight, and MaxHeight properties.
  • Updated Example 10 in the demo project to demonstrate setting the MinWidth, MaxWidth, MinHeight, and MaxHeight properties.
  • Added better support for server side resizing. Now, setting the SplitterBar.LeftColumnWidth or SplitterBar.TopRowHeight will automatically resize the target controls during a postback.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Jeff Bazinet
Web Developer
United States United States
VWD-CMS is an ASP.NET content management system designed and developed by Jeff Bazinet.

While VWD-CMS has been developed entirely in Visual Web Developer, it will power any ASP.NET 2.0 website.

VWD-CMS is a file based content management system that has been built with developers in mind -

one of the primary design requirements is that the CMS does not constrain or limit a developer.

Try the online demo and learn more about VWD-CMS at www.vwd-cms.com

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionNamespace Errormemberviru5detected15-Apr-13 16:27 
Questionhow to use RightResizetargets propertymemberShrish198612-Dec-12 1:20 
QuestionThe splitter is showing some width away from the td.memberShrish19863-Dec-12 19:53 
GeneralProblem with the splitter positionmemberMember 810781115-Jul-12 22:04 
Questionsplitterbar not workingmembervikas@199016-May-12 21:56 
GeneralMy vote of 5membermanoj kumar choubey16-Feb-12 0:21 
QuestiononResizeFunction javascript function never firedmemberjncharli4-Jan-12 12:18 
GeneralProblem with "splitter bar" being offset out of tablememberHubman12-Sep-10 14:05 
Hi -
 
Cool program, but I am having a problem with a two column table. The splitter bar is in the right place, but it is about 20px below the top of the table AND it protrudes out the bottom of the table by the same distance (20px). I suspect this is some sort of style sheet issue, but I can't figure it out. I am using Visual Studio 2010 and a master document.
 
Thanx!
GeneralRe: Problem with "splitter bar" being offset out of tablememberHubman12-Sep-10 15:41 
GeneralRe: Problem with "splitter bar" being offset out of tablememberCloudCasts22-Jan-12 11:11 
GeneralCompilation Error in VwdCms:SplittermemberAsifChouhan16-Jul-10 23:26 
Generalonresize event in body or div tagmemberit-bergmann7-Dec-09 6:39 
GeneralRe: onresize event in body or div tagmemberJeff Bazinet7-Dec-09 6:53 
GeneralRe: onresize event in body or div tagmemberit-bergmann7-Dec-09 22:04 
GeneralVB based ASP.NET conversionmemberHighFlight2k225-Sep-09 5:38 
GeneralScrollbars associated with the vertical splitter is not working Properly in IE 7.0memberMember 227048417-Sep-09 5:42 
Generalsplitterbarmemberkomalahirwal16-Sep-09 2:20 
QuestionHow to keep persistent stage of width among all pages when we are using splitter in master page [modified]memberMember 340379417-Jul-09 11:48 
AnswerRe: How to keep persistent stage of width among all pages when we are using splitter in master pagememberMember 405004621-Sep-09 20:05 
GeneralRe: How to keep persistent stage of width among all pages when we are using splitter in master pagememberMember 405004621-Sep-09 20:08 
GeneralRe: How to keep persistent stage of width among all pages when we are using splitter in master pagememberJeff Bazinet22-Sep-09 13:55 
GeneralLicense? [modified]memberSudhindra BK17-Jun-09 1:48 
GeneralLeftColumnWidth causes exception in Master PagememberMark Kestenbaum11-Jun-09 5:21 
GeneralCompile Error MessagememberMember 36923812-Jun-09 23:53 
GeneralRe: Compile Error Messagememberarifpk3621-May-10 0:54 
GeneralRe: Compile Error Messagemembersguruproject2-Aug-11 17:15 
QuestionHow to use the splitter in arabic pagesmemberVimalSaifudin20-Apr-09 4:15 
QuestionHow can I make the direction of the table right to left.memberMember 309448811-Jan-09 10:51 
AnswerRe: How can I make the direction of the table right to left.memberVimalSaifudin20-Apr-09 4:20 
GeneralRe: How can I make the direction of the table right to left.membermelwaer5-Nov-10 19:40 
Generalmessage shows "element 'SplitterBar' is not a known element"memberventure_luck17-Dec-08 23:09 
GeneralSplitter usememberMember 295449821-Nov-08 13:15 
GeneralASP.NET 1.1membernusoft247231-Oct-08 14:07 
GeneralRe: ASP.NET 1.1memberVNVNV10-Aug-09 23:31 
QuestionCan I chabge the Min and Max HeightmemberUdeshang13-Oct-08 5:53 
AnswerRe: Can I chabge the Min and Max HeightmemberJeff Bazinet13-Oct-08 19:31 
QuestionIs this control work with Web application instead of a website?memberRamu.M11-Oct-08 8:35 
AnswerRe: Is this control work with Web application instead of a website?memberJeff Bazinet11-Oct-08 21:52 
GeneralAJAX and Panel Visibilitymemberdarkpaladin6-Oct-08 5:26 
GeneralIt's really great but one issue, kindly help.membersc73803-Oct-08 0:46 
AnswerRe: It's really great but one issue, kindly help.memberJeff Bazinet3-Oct-08 1:18 
QuestionNot working with AJAX ????membersujit.patil7-Jul-08 1:29 
QuestionProblem With Spillter bar [modified]membersujit.patil6-Jul-08 20:46 
GeneralError messagememberhifans.net25-Jun-08 6:02 
AnswerRe: Error messagememberJeff Bazinet25-Jun-08 15:10 
GeneralNot working properly in firefox with CollapsiblePanelExtender Control and PopUp ExtendermemberIrfanKhan25-Jun-08 5:16 
AnswerRe: Not working properly in firefox with CollapsiblePanelExtender Control and PopUp ExtendermemberJeff Bazinet25-Jun-08 15:08 
GeneralRe: Not working properly in firefox with CollapsiblePanelExtender Control and PopUp ExtendermemberIrfanKhan25-Jun-08 22:00 
GeneralRe: Not working properly in firefox with CollapsiblePanelExtender Control and PopUp ExtendermemberIrfanKhan26-Jun-08 4:05 
AnswerPersist width to cookiememberJiaozi24-Jun-08 0:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130619.1 | Last Updated 11 Mar 2008
Article Copyright 2007 by Jeff Bazinet
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid