In my recent project we have had to implement a own textbox to be able to set a few properties that force the user to follow certain formats etc. A few days ago I saw this as an oppurtunity to do something cool as an additional feature.
I wanted to implement a AutoComplete feature but with the values that the user has typed in this field before. It turns out that this is fairly easy to do, since AutoComplete is a property on the TextBox control in the .NET Framework. Here is a nice video that introduce the concepts surrounding AutoCompletion
So how did I do it then? First I added a handling of the Resize-event that sets the autoComplete-properties.
Me.AutoCompleteMode = Windows.Forms.AutoCompleteMode.Suggest Me.AutoCompleteSource = Windows.Forms.AutoCompleteSource.CustomSource Me.AutoCompleteCustomSource = State.HamtaAutoCompleteLista(Me.Name)
State.HamtaAutoCompleteLista is a function that returns the AutoCompleteStringCollection that should be used for the control.
As you might notice I am using the name as key, to which you might have objections. Of course it would have been better to be using a more meaningful name that can be shared among several controls. If I want the same auto completion list to be shown for two textboxes they need to have the same name. For my purposes this is ok.
Then I did an override on the OnLostFocus-event to add new items into
the AutoCompleteCollection.
Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)' Don't add blankIf Not String.IsNullOrEmpty(Me.Text) ThenDim autoCompleteLista As AutoCompleteStringCollection = State.HamtaAutoCompleteLista(Me.Name)' Check if the text exists already - then don't add itIf Not autoCompleteLista.Contains(Me.Text) ThenautoCompleteLista.Add(Me.Text)End IfEnd IfMyBase.OnLostFocus(e)End Sub
So as you can see it wasn’t that much code to accomplish a dynamical
AutoComplete-function in a textbox.
I had some trouble to save it to User Setttings… but that will be
described in another post, maybe.