combobox autocomplete - DROPDOWNLIST

  • Thread starter Thread starter Bernie Yaeger
  • Start date Start date
B

Bernie Yaeger

Everyone misses the point on this - what we need is a combobox autocomplete
that is a dropdownlist only. When in dropdown mode, you can enter text -
making that autocomplete is trivial. But when you look at combobox controls
from years ago, they would autocomplete in dropdownlist mode. And if you
look at intellisense, this is exactly what happens, so obviously the .net
framework can do it.

Any help would be much appreciated.

Bernie Yaeger
 
Hi,

http://www.thecodeproject.com/vb/net/autocomplete_combobox.asp

Ken
---------------------
Everyone misses the point on this - what we need is a combobox autocomplete
that is a dropdownlist only. When in dropdown mode, you can enter text -
making that autocomplete is trivial. But when you look at combobox controls
from years ago, they would autocomplete in dropdownlist mode. And if you
look at intellisense, this is exactly what happens, so obviously the .net
framework can do it.

Any help would be much appreciated.

Bernie Yaeger
 
Hi Ken,

You are easily one of the most knowledgeable and helpful people on this ng.
So it is that much more disappointing that you didn't read what I said -
THIS DOESN'T WORK WITH A DROPDOWNLIST COMBOBOX!

Bernie
 
Bernie,
You are easily one of the most knowledgeable and helpful people on this
ng. So it is that much more disappointing that you didn't read what I
said - THIS DOESN'T WORK WITH A DROPDOWNLIST COMBOBOX!

If I understand you well, why than not make it your own by setting it in
combobox mode and doing a findstringexact when the user has selected an
item.

When it is not already in the combobox you can just ignore it, or even
ignore it with a message.

Maybe this helps, just a try?

Cor
 
Hi Cor,

Findstringexact won't solve the problem.

Let's say the combobox contains

twist
soccer player
coral
comment
complete

What the user wants is to enter 'c' and get 'comment'; enter 'o' and stay on
'comment'; enter 'm' and stay on 'comment'; enter 'p' and go to 'complete'.

This is the way dropdownlist comboboxes used to work - for at least the last
10 years before .net.

Thanks for any help.

Bernie
 
Bernie,

That is what in my opinion that autocomplete combobox would do what Ken has
showed you.

The difference between a combobox and a listbox is that you may enter and
use text in a combobox that is not in the listcontrol.

Therefore I came with that idea about checking first with findstringexact

Cor
 
Hi Cor,

There are lots of differences between a listbox and a combobox. But the
point is, in a combobox in dropdowlist mode, you cannot enter text - every
keystroke simply searches for the item that matches. By default, when in
dropdownlist mode, it simply finds the first item with the same initial
letter:

common
olive
call
complete

Entering a 'c' will find 'call', because it is first, alphabetically; then
entering an 'o' will find 'olive', etc. What I want - and what we had for
years - is for the user to enter 'c' and get call, but then enter 'o' and
get 'common', not 'olive'.

Bernie
 
Bernie,

I did write the wrong word, should have been combobox in dropdowlist mode
instead of listbox, however again, does that sample Ken showed you not do
that?

And than again, with the idea I added to that.

Cor
 
Bernie,

I know exactly what you want and why you want it, and no the example he
gave is not it. However, if you subclass it, and then grab the keydown
event and build your own string while the control has focus, you could
probably do some sort of manual find on it to get the one they want. I
will need this as well once I get more of my current project completed...

Aaron
 
Hi Aaron,

Tx for restoring my sanity!

Actually, I have already played around with the idea of using a global
string, exiting in the keyup event when tab, enter, arrows, etc and the
findstring with the global string. I then added a timer so that the global
string is cleared after a 2 second interval (so if you enter 'com' and wait
too long, 'p' with start again and find, say, 'paper'), because if you don't
clear the string the user can't make a second selection.

I may try to develop this into a custom control. If I do, I will email you
and let you know what I've done.

Bernie
 
That would be awesome!

Bernie said:
Hi Aaron,

Tx for restoring my sanity!

Actually, I have already played around with the idea of using a global
string, exiting in the keyup event when tab, enter, arrows, etc and the
findstring with the global string. I then added a timer so that the global
string is cleared after a 2 second interval (so if you enter 'com' and wait
too long, 'p' with start again and find, say, 'paper'), because if you don't
clear the string the user can't make a second selection.

I may try to develop this into a custom control. If I do, I will email you
and let you know what I've done.

Bernie
 
Hi Cor,

No; his suggestion only works for cropdown, not dropdownlist, comboboxes.
Your suggestion would not sequentially find, as findstringexact would not
begin the match until it was fully entered.

Bernie
 
Bernie,

Now I understand where we misunderstand each other, I was talking after that
the complete filling was done, while you are talking doing it.

Cor
 
Hi Cor,

Yes, exactly. I am testing using findstring against a global string. Let
know if you have any ideas that might help. Tx.

Bernie
 
Bernie,

To give me the idea, can you try if this is what you mean, you have to set
the combobox to the normal dropdown however set that dropdownliststyle to
true. I did not test it real deep, hower got the idea that it was working.

\\\
Private DropDownListStyle As Boolean
Private Sub combobox1_KeyUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyUp
Dim cbo As ComboBox = DirectCast(sender, ComboBox)
Select Case e.KeyCode
Case Keys.Back, Keys.Left, Keys.Right, Keys.Up, Keys.Delete,
Keys.Down
Return
End Select
Dim ComboBoxText As String = cbo.Text
Dim FirstFound As Integer = cbo.FindString(ComboBoxText)
If FirstFound >= 0 Then
Dim FirstFoundItem As Object = cbo.Items(FirstFound)
Dim FirstFoundText As String = cbo.GetItemText(FirstFoundItem)
cbo.Text = FirstFoundText
cbo.SelectionStart = ComboBoxText.Length
cbo.SelectionLength = cbo.Text.Length
Else
If DropDownListStyle = True Then
cbo.Text = cbo.Text.Substring(0, cbo.Text.Length - 1)
cbo.SelectionStart = cbo.Text.Length
End If
End If
End Sub
///

I hope we reach the idea?

Cor
 
Hi Cor,

There is only the dropdownstyle property, and it is not a boolean; rather it
sets to dropdown, dorpdownlist, etc. Is there a boolean property that I
can't see?

Tx

Bernie
 
Private DropDownListStyle As Boolean

In the top of my sample, when you use it as dropdownlist direct you cannot
enter keystrokes and it is so simple that making an inheritted combobox
seems too me a little bit overdone for that. I am thinking on another simple
improvement when it fits you.

Cor.
 
I am using VB 2005. (is there a different group for these questions, since
we haven't reach the release date yet?)

I am playing with the new AutoCompleteMode property of the ComboBox.

When the combobox DropDownStyle is DropDown, autocomplete works as desired.
But it is not "limit-to-list" like old Access. Change the style to
DropDownList and now it is "limit-to-list", but no longer Autocompletes. :(

Anybody have a suggestion?

Greg
 
Back
Top