Click here to Skip to main content
Licence 
First Posted 20 Feb 2005
Views 269,273
Bookmarked 165 times

Very Compatible DHTML Menu ASP.NET User Control

By | 10 Apr 2005 | Article
An ASP.NET user control for a DHTML drop down menu, with high compatibility and customization features.
Prize winner in Competition "ASP.NET Jan 2005"
 
Part of The SQL Zone sponsored by
See Also

Sample Image of very compatible DHTML menu

Sample Image of very compatible DHTML menu

Introduction

A DHTML menu is something many web developers use these days as those provide a friendly and hierarchical interface for users. In a project I’m working on, I need one of those, and I searched the web to find an ASP.NET control. There are some good examples of menu controls but none of them gives what really I want (cross-browser, VB.NET, code available, free, and with possibilities for nice styles). Then I found Sylvain Machefert’s work (in French). He is a web developer with good CSS, JavaScript and cross browser issues knowledge, who made a very compatible DHTML menu and released it to public. The menu even works on text based browsers, reading technologies for visually impaired considered, and the menu is not visible when printing your page. Also, it can be customized in many ways and it supports icon images. The list of compatible browsers:

  • Internet Explorer 5/5.5/6 Windows 98/2000/XP;
  • JAWS Vocal Synthesis in IE6 Windows XP;
  • MyIE2;
  • Netscape 7 Windows;
  • Netscape 6.2;
  • Mozilla 1.4+ Windows 2000/XP;
  • FireFox 0.9+;
  • Opera 7 Windows and Linux;
  • Lynx (text browser)
  • Encompass 0.5 et Dillo 0.8 (non CSS browsers) Linux (Debian);
  • Epiphany 1.2 Linux (Debian);
  • Galéon 1.2;
  • Konqueror Linux (Knoppix);
  • Mozilla Linux (Knoppix);
  • Internet Explorer 5 Mac;
  • Safari 1.0 MacOS X 10.2.8;
  • Safari 1.1 MacOS X 10.3;
  • Camino MacOS X;
  • Firebird MacOS X;
  • OmniWeb MacOS X;
  • Mozilla 1.6 Mac;
  • NeoPlanet 5.1;

Because Sylvain doesn’t have enough knowledge in .NET programming (at the time of this writing at least) he couldn’t release an ASP.NET custom control. There has been a previous example of a user control with Sylvain’s menu, made by guys at Sokhar (a web development company). However, there were a few issues with that one which didn’t go well with my project:

  • They used an old version of Sylvain's code, so less compatibility.
  • Their code is in C#, my project is in VB.NET, because I needed some changes it didn't work out.
  • I thought some improvements could be made besides multi browser issues, such as adding links to main menu titles, a bit improved HTML output, and the ability to change the looks of menu in each page of your project by using the control's properties.
  • Access database idea was great but I needed to implement it to my SQL project.

The only downside for some might be that the menu only supports one level branching. This is no problem for me because I believe more than two levels already messes up the looks of the page (and also I read an article on that matter).

I thank first Sylvain for his great work, and then Sokhar for their contribution; it was an important influence for my code.

Background

This is the first update of this DHTML menu user control. In this release, I made some improvements I was planning after I made the first release.

Well, what does the user control I made do? It reads which CSS file to use from the control property “CSSFile” as defined in your tag definition of the menu control in the aspx page and other properties that tweak menu looks. It loads menu data from an Access file and prepares a nice HTML output which is to be placed in the output of your aspx page. I used Access stored procedures to retrieve some data. I use stored procedures when I work with SQL, and as far as I know, stored procedures are a better way of dealing with data than using strings as command parameters. For those who don’t know about procedures, my code can be a good example work. It was, for me, an educative task as well, because Access (Microsoft Jet Engine, what Access uses as SQL implementation) procedures are defined a bit different than SQL Server ones. I learned about that during this work. My example project is ready for a vertical menu, centered vertically and with gradient filled menu backgrounds. There is also a CSS file included in the first release in the menu folder, so if you want, by changing properties (especially CSSFile property), you can get a different look with the example project. I translated the JavaScript file's comments to ease your way when improving my code or changing menu attributes. Code is heavily commented so I believe you won't have much to miss there. Feel free to ask if you don't understand something.

Using the code

Because I send .vb code pages as well, you can improve this control. Implementation is actually easy. First, create a “databases” folder in your project (right click the project name in your Visual Studio Solution Explorer window, not the solution name, solution name is the one at the top; Add >> New Folder, rename it to “databases”), then right click on the “databases” folder in your Visual Studio Solution Explorer window, Add >> Add Existing Item. You select in the file selection window your Access database file named “cssmenudb.mdb” (or edit the one I’m sending and select that). Be careful with “File Type” in selection window, it must be “All Files” or you won’t see the database file. Now create a folder named “menu” in your project folder (again by right clicking on the project name in the Solution Explorer). Use right click Add >> Add Existing Item method on “menu” folder to add menu.ascx and menu.ascx.vb files from my project (you can select more than one file on that window). You also need to add JavaScript CSS and icon images as well in that folder. Then the menu user control has to be registered in the page you want it to be implemented, by adding the line:

<%@ Register TagPrefix="userCtrl" TagName="CSSMenu" Src="menu/menu.ascx" %>

on top of the aspx page in HTML view, just below the Page directive. Now, you can add your menu’s tag in the HTML view, as in:

<userCtrl:CSSMenu id="Menu1" runat="server" HRImage="lookxphr.gif" 
      FollowScroll="false" CenterMenu="true" DefaultHeight="25" DefaultWidth="95" 
      Vertical="true" DiffWidth="true" CSSFile="vertical.css">
</userCtrl:CSSMenu>

I recommend you to put it above the form tag that is created automatically by Visual Studio in every aspx page. That’s it. You are ready to go.

Let's examine the properties of menu control:

  • HRImage

    If a submenu item has an image file with the same name of the value held in this property, then that menu item is considered as a horizontal ruler (separator). Image is loaded as a separator and tiled horizontally. Nothing more is printed for that menu item. Takes a string for filename of horizontal ruler image.

  • FollowScroll

    This boolean value of "True" or "False" describes whether menu should stay back when page moves forward when scrolled (if page is larger than standard window area) or follow the scroll and be visible all times.

  • CenterMenu

    Boolean value and its name tells all. If menu is in vertical mode (defined by Vertical property) and this property has value "True" then menu is centered vertically, and horizontally if menu is in horizontal mode.

  • Vertical

    Another boolean value. "True" for a vertical menu, "False" for horizontal.

  • DefaultHeight

    An integer number for main menu items' default height in pixels.

  • DefaultWidth

    An integer number for main menu items' default width in pixels.

  • DiffWidth

    The name should not confuse you. This boolean value property defines if main menu items are in different widths according to the number of letters in their title if they are in horizontal mode, or if main menu items are in different heights if they are in vertical mode.

  • CSSFile

    This string valued property keeps the name of the CSS file.

Points of Interest

This is one of the two stored procedures used in the Access database. As you can see (if you are familiar with this concept), the syntax is a bit different from SQL's one.

PROCEDURE sp_mainMenuURL
PARAMETERS mainMenuTitleArg Text ( 255 );
SELECT  tblMainMenu.mainURL
FROM tblMainMenu
WHERE  tblMainMenu.mainMenuTitle = mainMenuTitleArg;

mainMenuTitleArg is the argument this procedure takes to find which main menu item's URL we want to fetch from the database. Once the procedure is created in Access database (in Queries section, we prepare this code), it automatically deletes the first line with PROCEDURE statement.

For those of you unfamiliar with SQL procedures, here is the stored procedure above in TSQL (SQL implementation of Microsoft SQL Server 2000):

PROCEDURE sp_mainMenuURL
CREATE PROCEDURE sp_mainMenuURL
@mainMenuTitleArg NvarChar (255)
AS
SELECT mainURL
FROM tblMainMenu
WHERE mainMenuTitle=@mainMenuTitleArg;
GO

What to do next?

I made many improvements in this release I wanted to after I made version 1.0. Now I think it's time to give the users the facility to have more than one menu in their project. Consider a case where some users (let's say customers) are supposed to get different main menu and submenu items and other users (let's say employees) other items. Of course, in that case, security and more database tables come into consideration.

History

  • Version 1.4
    • Bug fix: Page refresh doesn't invalidate JavaScript and stylesheet anymore which used to happen in some cases before.
    • Everything to be written in HTML is kept in one ASP literal.
    • A constructor is added with default values of properties in case user forgets defining them in tag.
    • Seven new properties added for easier menu customization. No need to modify JavaScript file.
  • Version 1.0
    • First release.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

scubaduba

Software Developer

Turkey Turkey

Member

Bogac Guven
 
I love computing , programming, foreign languages...list goes on. I work in a construction company as an IT consultant and deputy manager.

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

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionMenu Position in Master Page PinmemberElie Sawma2:22 25 Oct '10  
Questionhi PinmemberMurat DOGANCAY6:41 14 Oct '09  
GeneralMy vote of 1 Pinmembersofter9:20 15 Jul '09  
QuestionHelp need on customizations PinmemberPraveen Srinivas12:56 6 Dec '08  
GeneralProblem of Inherits="CSSMenuNew.menu Pinmemberneedhi_p2:27 22 Apr '08  
GeneralRe: Problem of Inherits="CSSMenuNew.menu Pinmemberravi.g21:23 18 Nov '08  
Questionupdated for sql but needing recompile ? PinmemberVoxan Rider19:27 4 Nov '07  
GeneralSource Code PinmemberLu5ck16:21 6 Nov '06  
Generalplease give me the code for using the menu with sql server database Pinmemberindrani2223:28 15 Oct '06  
GeneralRe: please give me the code for using the menu with sql server database PinmemberVoxan Rider4:27 5 Nov '07  
Hi,
 
here is what i did for the menu.ascx.vb file but i think there is still a problem with the DLL based in the bin folder...
 
Basically the line that you should change (to get the same error as i do now)
is
strConnect = System.Configuration.ConfigurationManager.ConnectionStrings("CnnTextes").ToString

where you replace CnnTextes by the name of your connection string locaed in your webconfig file.
 

Imports System
Imports System.Data
'Imports System.Data.OleDb
Imports System.Drawing
Imports System.Web
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
Imports System.Text
Imports System.Data.Sql
Imports System.Data.SqlClient
 
' CSSMenu user control implementation of Sylvain Machefert’s DTML menu
' His website at http://iubito.free.fr
' ASP .Net Codding by Bogac Guven
' bogacmx@yahoo.com
 

Public Class menu
Inherits System.Web.UI.UserControl
 
Private _cssFile As String
Private _vert As String
Private _diffWidth As String
Private _defWidthValue As Integer
Private _defHeightValue As Integer
Private _centerMenu As String
Private _follScroll As String
Private _hrImg As String
 
#Region " Properties "
 

'By defining properties we are able to get variables that change our menu look
'from menu's tag in aspx page. Menu tag's attribute with same name to this property
'gets given value.
Public Property CSSFile() As String
Get
Return _cssFile
End Get
Set(ByVal Value As String)
If Value = "" Then
_cssFile = "default.css"
End If
_cssFile = Value
End Set
End Property
 
Public Property Vertical() As String
Get
Return _vert
End Get
Set(ByVal Value As String)
If Value.ToLower <> "true" And Value.ToLower <> "false" Then
_vert = "false"
Else
_vert = Value.ToLower
End If
End Set
End Property
 
Public Property DiffWidth() As String
Get
Return _diffWidth
End Get
Set(ByVal Value As String)
If Value.ToLower <> "true" And Value.ToLower <> "false" Then
_diffWidth = "true"
Else
_diffWidth = Value.ToLower
End If
End Set
End Property
 
Public Property DefaultWidth() As Integer
Get
Return _defWidthValue
End Get
Set(ByVal Value As Integer)
If IsNumeric(Value) Then
_defWidthValue = CInt(Value)
Else
_defWidthValue = 95
End If
End Set
End Property
 
Public Property DefaultHeight() As Integer
Get
Return _defHeightValue
End Get
Set(ByVal Value As Integer)
If IsNumeric(Value) Then
_defHeightValue = CInt(Value)
Else
_defHeightValue = 25
End If
End Set
End Property
 
Public Property CenterMenu() As String
Get
Return _centerMenu
End Get
Set(ByVal Value As String)
If Value.ToLower <> "true" And Value.ToLower <> "false" Then
_centerMenu = "false"
Else
_centerMenu = Value.ToLower
End If
End Set
End Property
 
Public Property FollowScroll() As String
Get
Return _follScroll
End Get
Set(ByVal Value As String)
If Value.ToLower <> "true" And Value.ToLower <> "false" Then
_follScroll = "true"
Else
_follScroll = Value.ToLower
End If
End Set
End Property
 
Public Property HRImage() As String
Get
Return _hrImg
End Get
Set(ByVal Value As String)
_hrImg = Value
End Set
End Property
 
#End Region
 
Public Sub New()
Me._cssFile = "lookxp.css"
Me._vert = "true"
Me._diffWidth = "false"
Me._defWidthValue = 95
Me._defHeightValue = 25
Me._centerMenu = "false"
Me._follScroll = "true"
Me._hrImg = "lookxphr.gif"
End Sub
 
#Region " Web Form Designer Generated Code "
 

Private Sub InitializeComponent()
 
End Sub
Protected WithEvents menuLiteral As System.Web.UI.WebControls.Literal
 
'NOTE: The following placeholder declaration is required by the Web Form Designer.
'Do not delete or move it.
Private designerPlaceholderDeclaration As System.Object
 
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
 
#End Region
 
#Region "DataSetHelper Class"
'Puclic Class DataSetHelper is as in article HOW TO: Implement a DataSet SELECT DISTINCT Helper Class in Visual C# .NET
'by Microsoft, with Article ID: 326176
'http://support.microsoft.com/default.aspx?scid=kb;en-us;326176
'Author made a Shared version of functions (as used in this code) and that code can be reached at:
'http://codebetter.com/blogs/sahil.malik/archive/2004/12/26/39040.aspx
'Converted to VisualBasic.Net from C# by VBNET Translator at:
'http://authors.aspalliance.com/aldotnet/examples/translate.aspx
'
'We are using SelectDistinct method defined here in BuildMenu() function below, that builds our menu,
' to get distinct main menu titles when our database stored procedure reads every sub-menu item.
Public Class DataSetHelper
 
Private Shared Function ColumnEqual(ByVal A As Object, ByVal B As Object) As Boolean
 
' Compares two values to see if they are equal. Also compares DBNULL.Value.
' Note: If your DataTable contains object fields, then you must extend this
' function to handle them in a meaningful way if you intend to group on them.
If A Is DBNull.Value And B Is DBNull.Value Then ' both are DBNull.Value
Return True
End If
If A Is DBNull.Value Or B Is DBNull.Value Then ' only one is DBNull.Value
Return False
End If
Return A.Equals(B) ' value type standard comparison
End Function 'ColumnEqual
 
Public Shared Function SelectDistinct(ByVal TableName As String, ByVal SourceTable As DataTable, ByVal FieldName As String) As DataTable
Dim dt As New DataTable(TableName)
dt.Columns.Add(FieldName, SourceTable.Columns(FieldName).DataType)
 
Dim LastValue As Object = DBNull.Value
Dim dr As DataRow
For Each dr In SourceTable.Select("", FieldName)
If LastValue Is Nothing Or Not ColumnEqual(LastValue, dr(FieldName)) Then
LastValue = dr(FieldName)
dt.Rows.Add(New Object() {LastValue})
End If
Next dr
Return dt
End Function 'SelectDistinct
 
End Class 'DataSetHelper
#End Region
 
Dim myConnection As SqlConnection
 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
'Dim dataBaseFileName As String = "databases/cssmenudb.mdb"
Dim strConnect As String
'Dim FileName As String = Server.MapPath(dataBaseFileName)
'strConnect = "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=" & FileName
strConnect = System.Configuration.ConfigurationManager.ConnectionStrings("CnnTextes").ToString
Try
 
myConnection = New SqlConnection(strConnect)
myConnection.Open()
Catch ex As Exception
menuLiteral.Text = ex.Message
End Try
' Construction of the menu from database for the first time
' or from the version which is already in session (if loaded previously for that session)
If Session("menuString") Is Nothing Then
menuLiteral.Text = BuildMenu()
Else
menuLiteral.Text = Session("menuString").ToString()
End If
 
myConnection.Close()
 
End Sub
 

Private Function BuildMenu() As String
 
Dim ulOpened As Boolean = False
Dim myAdapter As SqlDataAdapter
Dim myTable As DataTable
 
Dim OleDbCmdAllMenu As New SqlCommand("sp_CreateMenu", myConnection)
OleDbCmdAllMenu.CommandType = CommandType.StoredProcedure
 
myAdapter = New SqlDataAdapter(OleDbCmdAllMenu)
 

Dim menuId As Integer
'nbMenus is the number of top-level menus
Dim nbMenus As Integer = 0
'menu0 is a dummy variable to check menu titles with new ones when a new one added
Dim menu0 As String = ""
 
Dim imageOption As String
Dim urlOption As String
'If exist some arguments a new window will be opened. So onClick variable shall be filled and added to anchor tag
Dim onClick As String
'mySt is the string that contains all HTML code of menu
Dim mySt As New StringBuilder
 

myTable = New DataTable
 
myAdapter.Fill(myTable)
 
myAdapter.Dispose()
 
imageOption = ""
 

Dim myRow As DataRow
 

'myMainMenuURL will keep URL that redirects when a main menu title clicked
Dim myMainMenuURL As String
 
' A dummy data table to hold all distinct main menu titles available in
' myTable data table variable. This is needed because in the stored procedure that
' returns all menu information every meu item holds it's parent menu id.
' Meaning in that table main menu items exist more than once.
Dim mainMenuTitles As DataTable
mainMenuTitles = DataSetHelper.SelectDistinct("MainMenuTitles", myTable, "mainMenuTitle")
 
nbMenus = mainMenuTitles.Rows.Count
 
'varCenterAll is the string that holds javascript line for variable defining if menu centered or not.
'(If vertical vertically centered, if horizontal horizontally centered)
Dim varCenterAll As String = "var centrer_menu = " & CenterMenu & ";"
 
Dim varMainWidth As String = ""
Dim varMainHeight As String = ""
 
'Dummy string variable mainTitleDum will be used to check in For loop
'to see if current main menu title is the same as one cheked in previous
'itteration of for loop. If it's not then it means it's a distinct main menu title
'and previous paragraph tag

needs to be closed and new one needs to be opened.
Dim mainTitleDum As String = ""
 
'ATTENTION: even though it's called DiffWidth property as short for Different Width
'this variable actually says if we are going to use different values for main
'menu titles' widths if menu in horizontal mode, or, different height values if menu
'in vertical mode.
If DiffWidth = "true" And Vertical <> "true" Then
'For horizontal menu with different width option of main menu titles choosen
'instead of using one width value we have to use an array of values.
varMainWidth = "var largeur_menu = new Array("
 
For Each myRow In myTable.Rows
If myRow("mainMenuTitle") <> mainTitleDum Then
'You can use a different multiplier instead of 10. This function gives
'10 pixels of width for each letter in ain menu title which is enough
'for given style sheets. If you use larger fonts in your style sheets
'you better increase the multiplier. It's a try and see thing.
varMainWidth &= (myRow("mainMenuTitle").ToString.Length * 10).ToString & ","
mainTitleDum = myRow("mainMenuTitle")
End If
Next
'last coma needs to be deleted at the end of string that defines javascript array holding
'width variables.
varMainWidth = varMainWidth.Remove(varMainWidth.Length - 1, 1)
varMainWidth &= ");"
 
ElseIf DiffWidth = "true" And Vertical = "true" Then
'For vertical menu with different height option of main menu titles choosen
'instead of using one height value we have to use an array of values.
varMainWidth = "var largeur_menu = " & DefaultWidth.ToString & ";"
 
Dim dumyStr As String
 
Dim largeur As Integer 'largeur means width in French
 
'I wanted to keep width of main menu titles at times of 10
'because in given CSS files (example css files given with this project)
'each letter is as big to fit in 10 pixels area.
'That will be our starting point for the calculations we are about to make.
'If you consider using larger font sizes in your CSS files, you might need to consider
'greater values than 10.
'DefaultWidth property is supposed to hold a value enough to keep an average
'main menu title plus some free space on the sides.
largeur = Math.Floor(DefaultWidth / 10) * 10
 
varMainHeight = "var hauteur_menu = new Array("
Dim hautDummy As Integer
Dim hautonethird As Integer = Math.Floor(DefaultHeight / 3)
 
For Each myRow In myTable.Rows
If myRow("mainMenuTitle") <> mainTitleDum Then
'Lets say if main menu title is larger than number of letters * 10 plus
'50 pixels, it means that it can't fit in an average title box, so
'we have to make a second line. Some words in the title will hopefully
'written in second line and it will look neat.
If largeur + 50 < myRow("mainMenuTitle").ToString.Length * 10 Then
'Because of extra space, multiplying default height would give too
'big menu title box. I came up with this formula.
hautDummy = DefaultHeight * 2 - Math.Floor(hautonethird * 2)
varMainHeight &= hautDummy.ToString & ","
Else
'If numer of letter * 10 + 50 pixels can keep the title
'then why to bother with calculating a new value?
'Use default height.
varMainHeight &= DefaultHeight.ToString & ","
End If
mainTitleDum = myRow("mainMenuTitle")
End If
Next
'We have to delete last coma and write ); instead
varMainHeight = varMainHeight.Remove(varMainHeight.Length - 1, 1)
varMainHeight &= ");"
Else
'If DiffWidth property set to false, then we just use default width and
'height values.
varMainWidth = "var largeur_menu = " & DefaultWidth.ToString & ";"
varMainHeight = "var hauteur_menu = " & DefaultHeight.ToString & ";"
End If
 
'Now its time to write all those variable we defined in javascript before
'we call our menu.
mySt.Append("<script language=""javascript"" type=""text/javascript"">" & ControlChars.Lf)
mySt.Append(ControlChars.Tab & varMainWidth & ControlChars.Lf)
mySt.Append(ControlChars.Tab & varMainHeight & ControlChars.Lf)
mySt.Append(ControlChars.Tab & varCenterAll & ControlChars.Lf)
mySt.Append(ControlChars.Tab & "</script>")
 
'rest of javascript functions and variables are in menu.js file. We call that.
mySt.Append(String.Format("<script language=""javascript"" type=""text/javascript"" src=""menu/menu.js""></script>" & ControlChars.Lf))
 
'Here we use css file name we received from menu's property named CSSFile
'We can use an If statement to check if css file name is defined.
'If not a default one can be implemented.
'Up to you to code.
mySt.Append(String.Format("<link rel=""stylesheet"" type=""text/css"" href=""menu/{0}"">" & ControlChars.Lf, CSSFile))
 
'We start the creation of menu here
mySt.Append("

" & ControlChars.Lf)
mySt.Append("<script language=""Javascript"" type=""text/javascript""" & ">" & ControlChars.Lf)
' Number of main menu items is needed for javascript code to work properly.
'Some other variables defined in menu control's properties are defined here
'in javascript variables.
mySt.Append("var nbmenu=" & nbMenus & ";" & ControlChars.Lf)
mySt.Append("var suivre_le_scroll=" & FollowScroll & ";" & ControlChars.Lf)
mySt.Append("var vertical=" & Vertical & ";" & ControlChars.Lf)
mySt.Append("preChargement();" & ControlChars.Lf)
mySt.Append("</script>" & ControlChars.Lf)
 
menuId = 0
'menuId=0 is to check first execution of for loop which will construct the menu.
'If menuId is not 0 that means we read some data in a previous execution of the loop
'therefore we must write closing HTML tags.
 
' Construction of menu mainly done in this for loop.
For Each myRow In myTable.Rows
If myRow("mainMenuTitle").ToString() <> menu0 Then
 
'If this is not first read, that means we must close tags of previous execution.
If menuId <> 0 And ulOpened = True Then
mySt.Append(ControlChars.Tab & ControlChars.Tab & "" & ControlChars.Lf)
ulOpened = False
End If
'Here we get URLs of main menu titles
Dim mySqlMainMenuCmd As New SqlCommand("sp_mainMenuURL", myConnection)
mySqlMainMenuCmd.CommandType = CommandType.StoredProcedure
mySqlMainMenuCmd.Parameters.Add("mainMenuTitleArg", SqlDbType.NVarChar, 60).Value = myRow("mainMenuTitle").ToString()
'ExecuteScalar reads only one item from data table (first row, first column), which we know that we only have an URL for given
'main menu title
If mySqlMainMenuCmd.ExecuteScalar Is DBNull.Value Then
myMainMenuURL = ""
Else
myMainMenuURL = mySqlMainMenuCmd.ExecuteScalar
End If
 
menuId += 1
 

If myRow("subMenuTitle") Is DBNull.Value Then
 
'Main menu (top-menu) items are held in paragraph HTML tags

mySt.Append(String.Format(ControlChars.Tab & "

" & ControlChars.Lf, menuId))
If Not myMainMenuURL = "" Then
mySt.Append(String.Format(ControlChars.Tab & ControlChars.Tab & "{0} :" & ControlChars.Lf, myRow("mainMenuTitle").ToString(), myMainMenuURL))
Else
mySt.Append(String.Format(ControlChars.Tab & ControlChars.Tab & "{0} :" & ControlChars.Lf, myRow("mainMenuTitle").ToString()))
End If
 
mySt.Append(ControlChars.Tab & "

" & ControlChars.Lf)
 
Else
 
'Main menu (top-menu) items are held in paragraph HTML tags

mySt.Append(String.Format(ControlChars.Tab & "

" & ControlChars.Lf, menuId))
If Not myMainMenuURL = "" Then
mySt.Append(String.Format(ControlChars.Tab & ControlChars.Tab & "{1} :" & ControlChars.Lf, menuId, myRow("mainMenuTitle").ToString(), myMainMenuURL))
Else
mySt.Append(String.Format(ControlChars.Tab & ControlChars.Tab & "{1} :" & ControlChars.Lf, menuId, myRow("mainMenuTitle").ToString(), myMainMenuURL))
End If
 
mySt.Append(ControlChars.Tab & "

")
 
'Sub-menu items are grouped in unnumbered list tags below their top-menu titles
mySt.Append(String.Format(ControlChars.Lf & ControlChars.Tab & ControlChars.Tab & "
    " & ControlChars.Lf, menuId))
    ulOpened = True
    End If
     
    menu0 = myRow("mainMenuTitle").ToString()
    End If
     
    If myRow("subMenuTitle") Is DBNull.Value Then
    'Do Nothing
    Else
    If myRow("iconImage").ToString().Length <> 0 Then
    imageOption = myRow("iconImage").ToString()
    Else
    imageOption = "lookxpvide.gif"
    End If
     
    'To avoid "Page Cannot Be Shown" error when there is no URL entered in database,
    'instead of writing empty string we use Javascript's void function.
    'Otherwise we write appropriate URL.
    If myRow("URL").ToString().Length <> 0 Then
    urlOption = myRow("URL").ToString()
    Else
    urlOption = "javascript:void(0);"
    End If
     

    'If we have new window arguments in database, we hold them in urlOption variable.
    'this variable like imageOption which holds icon image filename,
    'will be added to string that forms each submenu item, just in the lines to follow.
    If myRow("newWinArgs").ToString().Length <> 0 Then
    onClick = " onClick=""Javascript:window.open('" & urlOption & "','window','" & myRow("newWinArgs").ToString() & "'); return false;"" "
    Else
    onClick = ""
    End If
     
    'If icon image of given sub menu item is same with menu property HRImage,
    'It means we are supposed to see just a horizontal ruler image that seperates
    'two submenu items and not a real menu title text or menu icon image.
    If myRow("iconImage").ToString() = HRImage Then
    mySt.Append(String.Format(ControlChars.Tab & ControlChars.Tab & ControlChars.Tab & "<img src=""menu/{0}"" class =""hr"" align=""absmiddle"" alt=""""/>" & ControlChars.Lf, imageOption))
    Else
    'Each submenu item is a HTML list item, we add here all their variables and form full
    'list item html string.
    mySt.Append(ControlChars.Tab & ControlChars.Tab & ControlChars.Tab & "
  • " & ControlChars.Lf)
    mySt.Append(String.Format(ControlChars.Tab & ControlChars.Tab & ControlChars.Tab & ControlChars.Tab & "<img src=""menu/{2}"" align=""absmiddle"" alt=""""/> {3} ;" & ControlChars.Lf, urlOption, onClick, imageOption, myRow("subMenuTitle").ToString()))
    mySt.Append(ControlChars.Tab & ControlChars.Tab & ControlChars.Tab & "
  • " & ControlChars.Lf)
    End If
     
    End If
     
    Next myRow
     
    If ulOpened = True Then
    'We close our menu
    mySt.Append(ControlChars.Tab & ControlChars.Tab & "
" & ControlChars.Lf)
ulOpened = False
End If
 
mySt.Append("
" & ControlChars.Lf)
mySt.Append("<script language=""Javascript"" type=""text/javascript"">Chargement();</script>" & ControlChars.Lf)
 
Session("menuString") = mySt.ToString()
Return mySt.ToString()
End Function 'BuildMenu
 
End Class

GeneralMenu Appearance Pinmembermeerak23:31 2 Aug '06  
GeneralRe: Menu Appearance PinmemberImparatorvolkan8:36 17 Oct '06  
QuestionRe: Menu Appearance Pinmemberyejivanhai7:18 22 Mar '07  
GeneralIE Crashes with smartnav on Pinmemberdbaser4:35 9 May '06  
GeneralMenu position Pinmembermburagohain23:36 27 Feb '06  
GeneralRemove image boxes from the sub-menus PinmemberBryanSherlock10:39 30 Jan '06  
GeneralHorizontal Menu PinmemberRichard Tibang18:44 14 Dec '05  
GeneralSub menu problem PinmemberGanesh M21:16 10 Nov '05  
GeneralMenu appearance problem in Safari on Mac OS PinmemberNazM20:26 5 Oct '05  
GeneralRe: Menu appearance problem in Safari on Mac OS Pinmemberpraveen_4569819:54 20 Sep '07  
QuestionCould we use in our site? Pinmemberaminey9:57 16 Sep '05  
QuestionVery Nice control but can you change the background color? Pinmemberdan180888:17 17 Aug '05  
GeneralAvoid Wrapping around Pinmemberrfalagan5:49 1 Aug '05  
GeneralRe: Avoid Wrapping around Pinmemberscubaduba8:29 6 Aug '05  
GeneralDrop down List PinmemberMicekillerus5:04 3 Jun '05  

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120529.1 | Last Updated 11 Apr 2005
Article Copyright 2005 by scubaduba
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid