Public Class ComboBoxEx Inherits System.Windows.Forms.ComboBox Private mclrDropDownStyle As ComboBoxStyle Private mclrAutoCompleteMode As AutoCompleteMode Private mclrAutoCompleteSource As AutoCompleteSource #Region "Declarations" Private InEditMode As Boolean = True #End Region #Region "Constructor" Public Sub ComboBoxEx() Me.DropDownStyle = ComboBoxStyle.DropDown Me.AutoCompleteMode = AutoCompleteMode.SuggestAppend Me.AutoCompleteSource = AutoCompleteSource.ListItems End Sub #End Region #Region "Properties" Public Overloads Property DropDownStyle() As ComboBoxStyle Get Return DropDownStyle End Get Set(ByVal Value As ComboBoxStyle) mclrDropDownStyle = Value End Set End Property 'DefaultValue(typeof(AutoCompleteMode), "SuggestAppend") Public Overloads Property AutoCompleteMode() As AutoCompleteMode Get Return AutoCompleteMode End Get Set(ByVal Value As AutoCompleteMode) mclrAutoCompleteMode = Value End Set End Property '[DefaultValue(typeof(AutoCompleteSource), "ListItems")] Public Overloads Property AutoCompleteSource() As AutoCompleteSource Get Return AutoCompleteSource End Get Set(ByVal value As AutoCompleteSource) mclrAutoCompleteSource = value End Set End Property #End Region #Region "Events" Protected Overrides Sub OnBindingContextChanged(ByVal e As EventArgs) Me.DropDownStyle = ComboBoxStyle.DropDown MyBase.OnBindingContextChanged(e) End Sub Protected Shadows Sub OnValidating(ByVal e As System.ComponentModel.CancelEventArgs) Dim index = FindStringExact(Text) If (index >= 0) Then MyBase.OnValidating(e) Else If (Text.Trim() = "") Then ' do nothing Else e.Cancel = True End If End If End Sub Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs) Me.InEditMode = (e.KeyCode <> Keys.Back And e.KeyCode <> Keys.Delete) MyBase.OnKeyDown(e) End Sub Protected Overrides Sub OnTextChanged(ByVal e As EventArgs) If (Me.InEditMode) Then Dim index = Me.FindString(Me.Text) If (index < 0 And Text.Trim() <> "") Then InEditMode = False Me.Text = Text.Substring(0, Text.Length - 1) Me.InEditMode = True End If End If Select Case (Me.Text.Length) End Select MyBase.OnTextChanged(e) End Sub #End Region End Class