Tab Control 1.5 for .NET

This code is an ASP.NET (VB) custom server tab control similar to what you would expect from a Windows application. It allows you to organise areas of your page or pages into tabs and for the user to select the tab to show the information neatly. By copying 1 folder of files to your site and adding a few lines of code to your page, you can have this control up and running in no time. The result is a professional looking, and familiar Windows style tabbed interface. You can also optionally add icons to each tab and set many interface settings. Tested under IE, Mozilla and Firefox.
Note: This code runs under .NET 2.0 only. For .Net 1.1 there is a zip file called which contains ver1.12 and is no longer being updated..

There are a few files &  folders of files provided with a Visual Studio 2005 solution file:
root - contains files to demonstrate the full usage of the control - use this as a reference to install the tab control in your web pages. Includes
bin - contains the compiled dll. If the dll is missing (some sites delete them) you will need to build (compile) the control - or download it from my web site.
TabControl - This is the only folder you need to copy into your web application.
TabControl\21px - Copy of the 21px high tab graphics. Copy up one folder to use these (and set .TabHeight ="21"). Default size is 25px.

Tab Types

The are 3 different types of tabs which can be used - depending on your situation: Dynamic, Inline Frames and PostBack.

Dynamic tabs are driven by DHTML, (DIV tags which are hidden and shown). These tabs are ideal for static data - or a large amount of info/fields in one form.

Frame tabs are driven by DHTML (IFRAME tags which are hidden and shown). These tabs are ideal for separate large or complex pages with many form fields or external web sites - but not 1 single form spread over more then 1 tab. The client browser must support Inline Frames (IE, Firefox, and later versions of Mozilla).

PostBack tabs are driven by a postback each time a tab is selected. Generally, either of the top 2 methods should be sufficient in 99.9% of cases. Pressing the Back button in the browser may be tiresome if you have clicked through the tabs a fair bit before hand.


A simplistic version of your code could look something like this (.aspx page):

<%@ Register TagPrefix="HB" NameSpace="Bean.Controls" Assembly="TabControl" %>
' Assembly = the dll file you compiled it to
' NameSpace = the namespace in
TabControl.vb - change this to anything you want to
' TagPrefix = anything

<HB:TabControl id="tabBar" runat="server" />
' HB = the TagPrefix you specified above
' VTabControl = the class name in TabControl.vb
- change this to anything you want to

' Using Dynamic mode in this example so setup the content inside of divs or any other single control.
The style attribute is optional - but can prevent flicker
<div id="divTab1" style="display:none">
tab contents 1...
<div id="divTab1" style="display:none">
tab contents 1...

And the simplistic version of your code behind could look something like this (.aspx.vb page):

'Inside the Page_Load, do all of the configurations
'(add 2 tabs, with icons, and set the target pages
tabBar.AddTab("tab name 1", "/images/icon1.gif", "divTab1")
tabBar.AddTab("tab name 2", "/images/icon2.gif", "divTab2")

'Set it to fixed width tabs and show the second one first
tabBar.TabWidth = "100"
tabBar.TabSelected = 2

See default.aspx for a real demonstration.


String. Optional.
Default: False
Apply style via style sheet to Frames and Divs. (mainly draws a box around the area)

String. Optional.
Default: "#FFFFFF"
Tab control background colour in HTML syntax: named or #hex number

String. Optional
Default: /Images/
Sets the path to all of the image files in the current Tab Control folder.

String. Optional
Default: /JS/
Sets the path to the javascript file in the current Tab Control folder.

String. Optional.
Default: 100%
Example: .ContentWidth = "400px"
Tab control content width is in HTML syntax: pixels, % or *
For Frames tab type only, if you specify * as the content width, the content area will dynamically change to the full window size - even if the window is resized. A 24px gap remains to the right in case the window's scroll bar is visible.
Another way to set a dynamic width in relation to the page is to have a parent table of 100% width and set the width of the other columns in pixels (not the column with the tab control in) then set the control to 100% width (which will result in the control resizing to the parent dynamic cell)

String. Optional.
Default: 80%
Example: .ContentHeight = "80%"
Tab control height is in HTML syntax: pixels, % or *
For Frames tab type only, if you specify * as the content height, the content area will dynamically change to the full window size - even if the window is resized by the user.

String. Optional
Default: ""
Example: .OnClick = "processClick('{0}');"
If a javascript command is provided to OnClick, then that command is executed when a tab is clicked. If you place {0} in the command, then that will be replaced with the tab index when it is clicked. If the second tab is clicked than the command issued for the above example will be: processClick('2');
The event only happens when a new tab is selected (not the same tab) and before the new tab shown.

Boolean. Optional
Default: nothing (auto)
For Dynamic and Inline Frames mode this forces (on or off) of the scrolling of the window. For Dynmic (divs) when true, this will also force the div height by enabling clipping.

Int16. Read Only.
Contains the count of tabs configured. Useful for sites that load tabs dynamically.

Boolean. Optional
Default: False
For Inline Frames, this will reset the current tab to it's original contents. It is possible to click to another page inside the tab if your page has links or the tab has an external site loaded.

Int16. Optional.
Default: 1
Show this tab # on page load

TabTypes enum. Optional
Default: Dynamic
Set the type of content area you wish to use

String. Optional.
Default: 25
Tab height is in pixels. This is just the tab itself, not the content. Sets all tabs to this height

String. Optional.
Default: auto
Tab width is in pixels. Sets all tabs to this width

Boolean. Optional
Default: True
Use the hand cursor over the tabs

Types Enum

Contains all possible values of TabType:


    Tab Text String: anything
    Image String: URL to the icon to be placed on the tab. Pass nothing ("") for no icon. Image must be a transparent gif and 19 pixels tall. At least the top 3 rows must be clear.
    Action String: For Dynamic: Tag ID of the associated DIV (or TABLE etc). For Inline Frames: URL/page file name, PostBack: blank.
Syntax: AddTab(Name, Image, Action)
Example: MyTabControl.AddTab ("Tab1", "icon_1.gif", "divTab1")  or  MyTabControl.AddTab ("Tab1", "", "")
Adds a page (tab) to the configuration. If in Dynamic mode, this control must precede the div tags of your tab contents.

Parameters: none
Syntax: ClearTabs()
Example: MyTabControl.ClearTabs() 

Parameters: none
Syntax: NewRow()
Example: MyTabControl.NewRow
Marks the point between AddTab calls where the next tabs should appear on the next new row.

Parameters: Tab name
Syntax: SelectTabName(strTabText)
Example: MyTabControl.SelectTabName("tab text")
Instead of using the TabSelected property (which is an integer index) use this to select a tab via it's name.

SelectTab  (Client Side / Javascript only)
Parameters: Tab number - indexed from 1
Syntax: SelectTab(intTabNumber);
Sometimes you may want a link in the content of a tab (or elsewhere on the page) to change the 
selected tab or you may have some javascript which wishes to change the selected tab on certain conditions, etc. This function makes it easy to select a new tab.


    Tab Index Int16: Index of tab selected
Syntax: Sub onTabSelected(TabIndex As Int16) Handles onTabSelected
Example: Sub onTabSelected(ByVal TabIndex As Int16) Handles MyTabControl.onTabSelected
Used only with PostBack tab type.


Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, with only one condition: References to the original author in the comments of the source code/scripts must remain in place. No other conditions or restrictions are made.
This software is provided "as is" without express or implied warranty.

If you improve this code, please send me a copy! Thanks!
Donate via PayPal

Hunter Beanland
hunter @

See default.aspx for a full demonstration.
NOTE: This control does not yet support 2 instances on the same page.

Version History

1.5.2 default tab height now 25px. Tab image valign, xhtml compliance fixes
1.5 Persisted TabSelected between page postings. Fixed XHTML tab width settings
1.4 Added ClearTabs, UseHand, onTabSelected event.
1.3 Added selectTab javascript function; Scroll property for frames and Dynamic (also enforces div height).
1.2.2 Improved Firefox compatibility.
1.2 Added .NET2.0 solution and compatibility, XML comments.
1.12 Changed namespaces and class name to be more meaningful.
1.11 Resolved sequencing of javascript blocks which may have lead to an error: "TabImagePath is not an object".
1.1 Added OnClick, Dynamic Frame Height/Width, SelectTabName method.
1.01 Adjusted Image vertical spacing and selected tab 'overlap' to right. Also included VS2002 solution files.
1.0 Based on concepts from my Tab Control for ASP3 v2.1. This is a 100% re-write including new JavaScript and images.