combobox autocomplete - DROPDOWNLIST

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
 
K

Ken Tucker [MVP]

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
 
B

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
 
C

Cor Ligthert

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
 
B

Bernie Yaeger

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
 
C

Cor Ligthert

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
 
B

Bernie Yaeger

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
 
C

Cor Ligthert

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
 
A

Aaron Smith

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
 
B

Bernie Yaeger

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
 
A

Aaron Smith

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
 
B

Bernie Yaeger

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
 
C

Cor Ligthert

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
 
B

Bernie Yaeger

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
 
C

Cor Ligthert

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
 
B

Bernie Yaeger

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
 
C

Cor Ligthert

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.
 
G

Greg Burns

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top