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

Share Post

Google+

comments powered by Disqus