Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Autocomplete combobox


Автор: avlzll 28.10.2010, 18:05
Приветствую smile

По умолчанию Access делает для так называемых Полей со списком автозаполнение по принципу [Поле] LIKE %. То есть предлагает автоподстановку только если совпали первые буквы. Вопрос. Возможно ли изменить это на [Поле] LIKE % ... %, то есть чтобы подстановка работала с любого места? 

Автор: Akina 28.10.2010, 20:39
Для стандартного контрола - нет.

Автор: avlzll 28.10.2010, 20:54
Цитата(Akina @ 28.10.2010,  20:39)
Для стандартного контрола - нет.

А есть варианты нестандартных? 

На данный момент я частично решил проблему, повесив такой код на эвент Combobox_Change так:
Код


 If Len(Me.Combobox1.Text) > 0 Then
           Me.Combobox1.RowSource = "SELECT db.НАИМ FROM acc1_short WHERE НАИМ Like '*" & _
           Me.Combobox1.Text & "*' ORDER BY НАИМ"
           Me.Combobox1.Dropdown
           
           Else
           Me.Combobox1.RowSource = "SELECT db.НАИМ FROM acc1_short"
    End If


Проблема возникает, например, на такой ситуации. Вводите какое-либо буквенное сочетание (скажем, "ОАО"), в dropdown'e, соответственно, показывается всё то, что подходит под эту строку (например, 5 записей). Нажимаем стрелку вниз на клавиатуре, чтобы перейти к нужной и список мгновенно обрубается до первого значения в нем. Понятно, что срабатывает переопределенный нами Change-эвент и проходит select запрос. Как с этим бороться пока не разобрался. Автоподстановка и автозамена выключены. Может как-нибудь переопределить KeyDown?


Автор: Bugmaker 29.10.2010, 08:53
Предлагаю ввести глобальную переменную, допустим
int isComboboxWorked =0;

а в вашем коде добавить
Код

isComboboxWorked=1

 If Len((Me.Combobox1.Text) > 0 And (isComboboxWorked=0)) Then
           Me.Combobox1.RowSource = "SELECT db.НАИМ FROM acc1_short WHERE НАИМ Like '*" & _
           Me.Combobox1.Text & "*' ORDER BY НАИМ"
           Me.Combobox1.Dropdown
           
           Else
           Me.Combobox1.RowSource = "SELECT db.НАИМ FROM acc1_short"
    End If

гдето тут проверить изменилось ли значение ячейки(был лы сделан выбор из комбобокса)
если да, значит isComboboxWorked=0


Смысл думаю ясен. На практическую реализацю нет пока времени.

Автор: avlzll 29.10.2010, 12:52
Bugmaker, отлично, спасибо за подсказку в правильном направлении smile

В итоге получилось вот что:
Код

Private Sub Combobox1_Change()
 If (Len(Me.Combobox1.Text) > 0 And comboBoxFlag = False) Then
           Me.Combobox1.RowSource = "SELECT db.НАИМ FROM db WHERE НАИМ Like '*" & _
           Me.Combobox1.Text & "*' ORDER BY ПОЛНОЕ_НАИМ"
           Me.Combobox1.Dropdown
           
           ElseIf (comboBoxFlag = True And Len(Me.Combobox1.Text) > 0) Then
           Me.Combobox1.Dropdown
           
           ElseIf (Len(Me.Combobox1.Text) = 0) Then
           Me.Combobox1.RowSource = "SELECT db.НАИМ FROM db"
    End If
End Sub


Код

Private Sub Combobox1_KeyDown(KeyCode As Integer, Shift As Integer)
    
    Select Case KeyCode
    Case 38 'Up Arrow
    comboBoxFlag = True
    
    Case 40 'Down Arrow
    comboBoxFlag = True   
    
    End Select
End Sub


Вроде правильно работает smile

Автор: Akina 29.10.2010, 13:32
Цитата(avlzll @  29.10.2010,  13:52 Найти цитируемый пост)
    Case 38 'Up Arrow

В VB(A) есть предопределённые константы, типа vbKeyUp - разумнее использовать их. См. соотв. раздел справки.

Автор: avlzll 29.10.2010, 13:48
Цитата(Akina @ 29.10.2010,  13:32)
Цитата(avlzll @  29.10.2010,  13:52 Найти цитируемый пост)
    Case 38 'Up Arrow

В VB(A) есть предопределённые константы, типа vbKeyUp - разумнее использовать их. См. соотв. раздел справки.

Не знал, спасибо.

Код

Select Case KeyCode 
        
        Case vbKeyDown
        comboBoxFlag = True    
      
        Case vbKeyUp
        comboBoxFlag = True  
           
End Select 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)