This is another forum request. I’ve seen multiple requests from users who are looking to customize the drop down window for the ComboBox control. There is no builtin way to do this with the existing control. Instead you must create a custom solution.
Start by adding a new UserControl to your windows application or library project. Have it inherit from ComboBox and call it CustomComboBox.
This ComboBox will display a user provided control for the drop down window. We will be using an instance of System.Windows.Form (named m_form) to replace the drop down window. The idea is to have the control to essentially float below the ComboBox much like the drop down window does today. To do this we need to custom the Form to not show up in the task bar and to not have a titlebar or default buttons.
We also need to prevent the ComboBox from droping down the builtin window. There is no way to actually stop the ComboBox from dropping down the window. Instead we need to make it appear that the drop down didn’t display by setting it’s height to 1 pixel.
To make the logic a bit easier, we will also provide a default empty control to be displayed when the drop down is expanded
Here is the full text of the constructor used to initialize the CustomComboBox
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
' Setup the form to display the control
m_form = New Form()
m_form.StartPosition = FormStartPosition.Manual
m_form.FormBorderStyle = FormBorderStyle.None
m_form.Hide()
m_form.ShowInTaskbar = False
Me.Control = New Control() ' Default Control
m_dropDownHeight = Me.DropDownHeight
Me.DropDownHeight = 1 ' Prevent the DropDown from showing
End Sub
The next step is to have the form display in the proper place when the drop down button is hit. To do this we override the OnDropDown() method and add the display logic there.
Protected Overrides Sub OnDropDown(ByVal e As System.EventArgs)
MyBase.OnDropDown(e)
If Not m_form.Visible Then
DisplayControl()
End If
Me.DroppedDown = False
End Sub
Private Sub DisplayControl()
Dim loc As Point = Me.PointToScreen(Point.Empty)
loc.Y += Me.Height
m_form.Location = loc
m_form.Show()
End Sub
The last item left is to add a property for the user to set the custom control to display. To be flexible we will allow instances of Control. It will be docked in the form. We also need to listen to the LostFocus event on the control. This is the key for us to hide the form like when the user clicks away from the normal ComboBox.
Public Property Control() As Control
Get
Return m_control
End Get
Set(ByVal value As Control)
If Not m_control Is Nothing Then
m_form.Controls.Remove(m_control)
RemoveHandler m_control.LostFocus, AddressOf Me.OnControlLostFocus
End If
m_control = value
m_control.Dock = DockStyle.Fill
AddHandler m_control.LostFocus, AddressOf Me.OnControlLostFocus
m_form.Controls.Add(m_control)
End Set
End Property
Private Sub OnControlLostFocus(ByVal sender As Object, ByVal e As EventArgs)
m_form.Hide()
End Sub