5,692,513 members and growing! (16,083 online)
Email Password   helpLost your password?
Web Development » ASP.NET » General     Intermediate

DropDownList and ListBox ASP.NET controls with autosearch and popup tooltip

By Anatoliy Khotin

Simple and very useful addition to standard DropDownList and ListBox controls
Javascript, HTML, C# 1.0, C#, Windows, .NET, .NET 1.1, ASP.NET, IE, WebForms, VS.NET2003, Visual Studio, Dev

Posted: 9 Mar 2006
Updated: 15 Oct 2006
Views: 108,473
Bookmarked: 85 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
28 votes for this Article.
Popularity: 5.76 Rating: 3.98 out of 5
2 votes, 7.1%
1
2 votes, 7.1%
2
3 votes, 10.7%
3
9 votes, 32.1%
4
12 votes, 42.9%
5
Note: This is an unedited contribution. If this article is inappropriate, needs attention or copies someone else's work without reference then please Report This Article

Sample Image - xNetComponents.gif

Introduction

When I was involved in one of my projects, where we used many aspx pages with DropDownLists and ListBoxs for selecting persons, departments and etc., my customer asked me if he could type the characters on his keyboard and select the suitable item. And I tried to make work easier for him. At first it was only javascript code and now it is ASP.Net server controls.
So, I'd like to describe two ASP.Net server controls: xNetDropDownList and xNetListBox with possibility to move focus to the first most suitable item on the list when a user types in characters on the keyboard.

Background

The principle of work for both components is similar, therefore I will describe xNetDropDownList.
On a client side element xNetDropDownList is represented as an HTML <select> box. When an element receives focus a Tooltip appears above it. Entered characters are represented in Tooltip and focus moves to the first suitable item on the list. Pressing Escape deletes all entered characters and focus moved to the first item. Backspace key deletes the last entered character. Focus is moved to the item on the list, corresponding the text in the Tooltip after deleting the character. When an element losses focus Tooltip disappears.

For correct work the list of items must be sorted in an ascending order!

Implementation

The component xNetDropDownList is inherited from the System.Web.UI.WebControls.DropDownList. Several new properties were added to it. They are mainly used for setting visual parameters of the ToolTip.
These properties are described in the table:

Public property Type Description
ToolTipHide bool Gets or sets visibility of ToolTip. False - to show ToolTip, true – not to show
ToolTipBackColor Color Gets or sets the background color
ToolTipBorderColor Color Gets or sets the border color
ToolTipBorderStyle BorderStyle Gets or sets the border style
ToolTipBorderWidth Unit Gets or sets the border width
ToolTipFontFamily string Gets or sets an ordered array of font names
ToolTipFontSize FontUnit Gets or sets the font size
ToolTipFontBold bool Gets or sets a value that indicates whether the font is bold
ToolTipForeColor Color Gets or sets the color of the text
ToolTipOffsetLeft int Gets or sets horizontal moving the left top point of ToolTip as for the co-ordinate of DropDownList or ListBox.
Measuring unit is a pixel.
In the properties designer just figures (integers) are typed in.
ToolTipOffsetTop int Gets or sets vertical moving the left top point of ToolTip as for the co-ordinate of DropDownList or ListBox.
Measuring unit is a pixel.
In the properties designer just figures (integers) are typed in.
ToolTipPadding Unit Gets or sets the amount of space to insert between the text and border
ToolTipInitialWidth Unit Gets or sets initial width
ToolTipZIndex int Gets or sets z-index
ToolTipSaveText bool Gets or sets saving the typed in text in ToolTip. If true – typed in text is saved, when the element loses and again acquires focus. If false the typed in text is lost

The picture gives explanation for ToolTipOffsetLeft and ToolTipOffsetTop properties:

The functionality of searching suitable item on the list is realized on JavaScript.

Function xOnFocus() is used for creating and setting properties for ToolTip.
When element <select> receives focus first time new HTML element <div> is created, otherwise function controls behavior of ToolTip as for settings in ToolTipSaveText and ToolTipHide properties.

function xOnFocus(elm)
{
    var el = document.getElementById('div_' + elm.id);
    if (!el)
    {
        var xdiv = document.createElement('DIV');
        xdiv.id = 'div_' + elm.id;
        xdiv.noWrap = true;
        xdiv.style.position = 'absolute';
        
        xdiv.ToolTipText = '';
        xdiv.style.color = elm.ToolTipForeColor;
        xdiv.style.width = elm.ToolTipInitialWidth;
        xdiv.style.padding = elm.ToolTipPadding;
        xdiv.style.display  = (elm.ToolTipHide == 'false') ? 'inline' : 'none';
        xdiv.style.backgroundColor = elm.ToolTipBackColor; 
        xdiv.style.borderColor = elm.ToolTipBorderColor; 
        xdiv.style.borderStyle = elm.ToolTipBorderStyle; 
        xdiv.style.borderWidth = elm.ToolTipBorderWidth; 
        xdiv.style.fontFamily = elm.ToolTipFontFamily; 
        xdiv.style.fontSize = elm.ToolTipFontSize; 
        xdiv.style.fontWeight = elm.ToolTipFontBold;
        xdiv.style.zIndex = elm.ToolTipZIndex;

	if (document.documentElement && document.documentElement.scrollTop)
		xdiv.style.top = document.documentElement.scrollTop + elm.getBoundingClientRect().top - parseInt(elm.ToolTipOffsetTop);
	else
		xdiv.style.top = document.body.scrollTop + elm.getBoundingClientRect().top - parseInt(elm.ToolTipOffsetTop);
	if (document.documentElement && document.documentElement.scrollLeft)
		xdiv.style.left = document.documentElement.scrollLeft + elm.getBoundingClientRect().left + parseInt(elm.ToolTipOffsetLeft);
	else
		xdiv.style.left = document.body.scrollLeft + elm.getBoundingClientRect().left + parseInt(elm.ToolTipOffsetLeft);

	elm.insertAdjacentElement('afterEnd', xdiv);
    }
    else
    {
	if (document.documentElement && document.documentElement.scrollTop)
		el.style.top = document.documentElement.scrollTop + elm.getBoundingClientRect().top - parseInt(elm.ToolTipOffsetTop);
	else
		el.style.top = document.body.scrollTop + elm.getBoundingClientRect().top - parseInt(elm.ToolTipOffsetTop);
	if (document.documentElement && document.documentElement.scrollLeft)
		el.style.left = document.documentElement.scrollLeft + elm.getBoundingClientRect().left + parseInt(elm.ToolTipOffsetLeft);
	else 
		el.style.left = document.body.scrollLeft + elm.getBoundingClientRect().left + parseInt(elm.ToolTipOffsetLeft);

        if (elm.ToolTipSaveText == 'false') 
        {
            el.innerText = '';
            el.ToolTipText = '';
        }
        el.style.display  = (elm.ToolTipHide == 'false') ? 'inline': 'none';
    }
}

Function xOnBlur() hides ToolTip.

function xOnBlur(elm)
{
    var el = document.getElementById('div_' + elm.id);
    if (el) el.style.display = 'none';
}

Function xOnKeyUp() handles pressing the following keys: Esc, BackSpace, Enter.
Notice, if property AutoPostBack is true, in addition to standard behavior of DropDownList and ListBox controls, an automatic postback to the server will occur when the user presses Enter key.

function xOnKeyUp(key_event)
{
    var lb = key_event.srcElement;

    var el = document.getElementById('div_' + lb.id);
    if (el)
    {
        if (key_event.keyCode == 8)
        {
            key_event.returnValue = false;
            if (el.ToolTipText.length > 0) el.ToolTipText = el.ToolTipText.substr(0, el.ToolTipText.length - 1);

            el.innerText = el.ToolTipText + ' ';
            xFindItem(el.ToolTipText, lb);
        }

        if (key_event.keyCode == 27)
        {
            key_event.returnValue = false;

            el.ToolTipText = '';
            el.innerText = '';
            xFindItem(el.ToolTipText, lb);
        }

        if (key_event.keyCode == 13)
        {
            key_event.returnValue = true;
            if (lb.AutoPostBack == 'true') lb.onchange();
        }
    }
}

Function xOnKeyPress() processes alphanumeric characters.

function xOnKeyPress(key_event)
{
    var lb = key_event.srcElement;

    var el = document.getElementById('div_' + lb.id);
    if (el)
    {
        if (key_event.keyCode != 13)
        {  
            el.ToolTipText = el.ToolTipText + String.fromCharCode(key_event.keyCode); 
            el.innerText = el.ToolTipText +' ';
            xFindItem(el.ToolTipText, lb);
        }
        key_event.returnValue = false;
     }
}

Function xFindItem() is main function and it is responsible for searching an item on the list.

function xFindItem(s, lb)
{
    s = s.toUpperCase();
    
    var slen = s.length;
    var lblen = lb.length;
    var lbo = lb.options;
        
    if (slen == 0 && lblen > 0)
    { 
        lb.selectedIndex = 0;
        return;
    }

    for (i = 0; i < lblen; i++)
    {    
        if (lbo[i].text.toUpperCase().substr(0, slen) == s)
        {
            lb.selectedIndex = i;
            break;
        }
    }
}

Components were tested in Internet Explorer version 6.0.

Using the code

- just like any other web server control.

Examples

There are three pages included in demo project:
Sample1.aspx - xNetDropDownList and xNetListBox contains the list of the last and first names entered directly through ListItem Collection Editor. This page demonstrates general work of components.
Sample2.aspx - xNetDropDownList and xNetListBox are connected to Northwind database (MS SQL Server). Remember to change user name and password in the connection string!
Sample3.aspx – presents different variants of appearance.

History

  • 10th Mar, 2006
    • Article submitted.
  • 12th Jun, 2006
    • Press enter key issue was resolved.
  • 18th Jun, 2006
    • The same issue with tab key was corrected.
  • 6th Aug, 2006
    • The problem with setting properties through code was resolved.
  • 15th Oct, 2006
    • The issues with position of the tooltip after window resize and IE6 with DOCTYPE were fixed. Thanks to Ondra Jires.

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

Anatoliy Khotin



Occupation: Web Developer
Location: Ukraine Ukraine

Other popular ASP.NET articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 25 of 66 (Total in Forum: 66) (Refresh)FirstPrevNext
Generalnot working in IE7!!!memberrotemno13:20 26 Mar '08  
GeneralHow to use source codememberGeorge Branch5:16 29 Feb '08  
QuestionWhat is the roughly max no. of items it can handle?memberabhiutd5:32 17 Oct '07  
QuestionUpdated codememberPremnathj5:15 2 Aug '07  
QuestionHow to change color of Dropdownlist border (IE)memberTran Huynh Long16:44 25 Jul '07  
GeneralTHE tooltip is not appear!!memberBennyzhang18:45 22 Jun '07  
QuestionTabbing out of dropdown control with autopostback set to falsememberjoalonzo20067:09 15 Mar '07  
GeneralКосякmembertyman4:09 5 Feb '07  
AnswerRe:memberAnatoliy Khotin21:35 6 Feb '07  
GeneralRe:membertyman22:05 6 Feb '07  
AnswerRe:memberAnatoliy Khotin2:16 7 Feb '07  
GeneralRe:membertyman3:24 7 Feb '07  
GeneralExtra Columnmember4:19 29 Jan '07  
AnswerRe: Extra ColumnmemberAnatoliy Khotin22:05 6 Feb '07  
QuestionIs there any updates to the code?memberPremnathj5:14 2 Aug '07  
GeneralExtra Columnmember4:19 29 Jan '07  
QuestionTooltip text is not displaying [modified]memberv_pratap_g1:54 11 Sep '06  
AnswerRe: Tooltip text is not displayingmemberAnatoliy Khotin5:52 12 Sep '06  
GeneralRe: Tooltip text is not displayingmemberv_pratap_g4:14 19 Sep '06  
AnswerRe: Tooltip text is not displayingmemberAnatoliy Khotin10:38 15 Oct '06  
GeneralRe: Tooltip text is not displayingmemberlamiae187:00 6 Dec '06  
AnswerRe: Tooltip text is not displayingmemberAnatoliy Khotin1:21 9 Jan '07  
GeneralRe: Tooltip text is not displayingmemberaibo3:40 9 Jan '07  
GeneralRe: Tooltip text is not displayingmemberAnatoliy Khotin22:50 9 Jan '07  
GeneralFocus on Listboxmembertcm113:10 5 Aug '06  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 15 Oct 2006
Editor:
Copyright 2006 by Anatoliy Khotin
Everything else Copyright © CodeProject, 1999-2008
Web16 | Advertise on the Code Project