5,664,339 members and growing! (18,090 online)
Email Password   helpLost your password?
Desktop Development » Combo & List Boxes » ComboBox Controls     Intermediate License: The GNU Lesser General Public License

Customizable ComboBox Drop-Down

By lhayes00

A combobox control with a customizable drop-down
C# (C# 2.0, C#), Windows, .NET (.NET, .NET 3.0), GDI+, Dev

Posted: 22 Apr 2008
Updated: 15 Jul 2008
Views: 24,145
Bookmarked: 57 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
27 votes for this Article.
Popularity: 5.73 Rating: 4.00 out of 5
0 votes, 0.0%
1
2 votes, 7.4%
2
5 votes, 18.5%
3
9 votes, 33.3%
4
11 votes, 40.7%
5
Sample Image

Introduction

This article presents an extension of the .NET ComboBox which provides custom drop-downs. The control can automatically add a resizer grip at the bottom of a drop-down.

Design

Custom drop-down functionality can be achieved using the .NET ToolStripDropDown and ToolStripControlHost classes. These two classes are great because they prevent application forms from becoming inactive during drop-down. The custom popup functionality required by this control has been encapsulated within the class PopupControl (a new addition since the original article posting).

In addition to facilitating this control, the PopupControl class can be used to provide drop-down support in your own controls. The PopupControl also integrates the drop-down resize support (now without the need for a nested resizable container, see below for details).

Previously the drop-down control was resizable by nesting a resizable container. This was an okay solution (because it worked) but it caused some redraw errors during resize operations. The resize functionality has now been significantly improved, and it is now also possible to define which sides of the drop-down are resizable (if any). Resizing can now also be done by dragging the resizable edges of the drop-down. The new resize functionality is achieved by intercepting Win32 hit testing messages, and responding appropriately based upon the set PopupResizeMode property.

The following UML class diagram provides an overview of the presented classes:

Using the Code

As with most controls, this control can be created dynamically at runtime, or by using the Visual C# IDE designer's drag and drop features. During runtime, the property DropDownControl must be assigned to an instance of another control. The assigned control must not be contained elsewhere as this will cause problems.

Most drop-down controls appear better when their borders are removed.

namespace CustomComboDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Dynamically created controls.

            // Create grid view control.
            DataGridView gridView = new DataGridView();
            gridView.BorderStyle = BorderStyle.None;
            gridView.Columns.Add("Column1", "Column 1");
            gridView.Columns.Add("Column2", "Column 2");
            gridView.Columns.Add("Column3", "Column 3");
            gridView.Columns.Add("Column4", "Column 4");
            gridView.Columns.Add("Column5", "Column 5");
            this.customComboBox1.DropDownControl = gridView;

            // Create user control.
            UserControl1 userControl = new UserControl1();
            userControl.BorderStyle = BorderStyle.None;
            this.customComboBox2.DropDownControl = userControl;

            // Create rich textbox control.
            RichTextBox richTextBox = new RichTextBox();
            richTextBox.BorderStyle = BorderStyle.None;
            this.customComboBox3.DropDownControl = richTextBox;
        }
    }
}

Points of Interest

When writing the code I found that dropped-down controls were not retrieving immediate input focus. This problem occurs because even though the drop-down code is ignored during the Win32 message handler, the standard win32 drop-down still appears (1x1 pixels). To avoid this, a timer is created which forces the dropped-down control to be focused after the default win32 drop-down has been focused. Once the timer has done its job, it disables itself.

History

  • 22nd April, 2008: Original version posted
  • 29th April, 2008: Updated download files
    • Fixed a bug that was pointed out by Adam Hearn
  • 17th June, 2008: Various changes:
    • Improved design
    • Odd drawing effects during drop-down resize have now been significantly improved
    • Added PopupControl for general custom drop-down support
    • Added download files: Version 2
  • 28th June, 2008: Updated download files for Version 2
  • 15the July, 2008: Updated to version 2.1.
    • Many thanks to member “Leon v Wyk” for this update.
    • The improved version now hides incompatible properties from the Visual Studio .IDE properties panel which was causing confusion

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License

About the Author

lhayes00


I have been using computers since I was about 8 years old, and have always enjoyed studying new concepts and technologies. I have been programming since about 1995 and have become experienced with many programming languages and technologies including C/C++, C#, DirectX, OpenGL, Java, ASP.NET, XML, XSL, SQL, JavaScript, HTML, CSS, ActionScript, VB, and Conitec Game Studio A5 Pro.

I have always been interested in game and multimedia development and have recently graduated with the first-class degree "BEng Games and Entertainment Systems Software Engineering" at the University of Greenwich.

Since graduating I have been continuing to study software and game development. In particular I am interested in game engine creation and programming language development. In addition to study, I am working on the design and creation of a game engine.

In my spare time I enjoy playing my musical instruments, especially my guitars. Its great fun and something which helps me unwind after a long day. I enjoy many flavours of music, in particular rock and heavy metal bands like Megadeth, Anacrusis, and Pink Floyd.
Location: United Kingdom United Kingdom

Other popular Combo & List Boxes 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 20 of 20 (Total in Forum: 20) (Refresh)FirstPrevNext
GeneralEscape issuememberBrad Bruce1:33 16 Jul '08  
GeneralRe: Escape issuememberlhayes008:32 17 Jul '08  
GeneralPlease !! help custommemberkristianbr8:10 14 Jul '08  
GeneralRe: Please !! help custommemberlhayes0010:37 14 Jul '08  
GeneralRe: Please !! help custommemberkristianbr9:07 20 Jul '08  
GeneralPreviously the drop-down control was resizable by nesting a resizable containermemberaames5:51 27 Jun '08  
GeneralRe: Previously the drop-down control was resizable by nesting a resizable containermemberlhayes006:02 27 Jun '08  
GeneralDropDownListmemberDp0H4:44 26 Jun '08  
GeneralRe: DropDownListmemberlhayes009:16 26 Jun '08  
GeneralRe: DropDownListmemberlhayes009:05 28 Jun '08  
GeneralRe: DropDownListmemberLeon v Wyk4:36 10 Jul '08  
GeneralRe: DropDownListmemberlhayes0014:12 11 Jul '08  
GeneralKeyboard handlingmemberDp0H3:52 26 Jun '08  
GeneralRe: Keyboard handlingmemberlhayes009:24 26 Jun '08  
GeneralResizeMode errormemberDp0H2:20 25 Jun '08  
GeneralRe: ResizeMode errormemberlhayes009:58 26 Jun '08  
GeneralNicely donememberMANUMATIC4:07 13 May '08  
GeneralGood articlemembersrinath g nath4:44 1 May '08  
GeneralDropdown arrow should also close the dropdownmemberadamhearn21:41 28 Apr '08  
GeneralRe: Dropdown arrow should also close the dropdownmemberlhayes005:10 29 Apr '08  

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

PermaLink | Privacy | Terms of Use
Last Updated: 15 Jul 2008
Editor: Sean Ewington
Copyright 2008 by lhayes00
Everything else Copyright © CodeProject, 1999-2008
Web10 | Advertise on the Code Project