2015-08-03 2 views
0

В основном я пытаюсь отображать различные наборы текстовых полей в пользовательской форме в зависимости от значения, полученного с помощью combobox. Я создал модуль класса вызовов CControlEvents, в котором я описываю события, которые должны произойти при изменении значения выпадающего списка:Комбинированный прослушиватель событий для динамического пользовательского интерфейса

Private WithEvents mclsCbx As MSForms.ComboBox 
 
Private mMyProperty As Integer 
 

 
Public Property Set Cbx(ByVal clsCbx As MSForms.ComboBox): Set mclsCbx = clsCbx: End Property 
 
Public Property Get Cbx() As MSForms.ComboBox: Set Cbx = mclsCbx: End Property 
 

 
Public Property Get MyProperty() As Integer 
 
    MyProperty = mMyProperty 
 
End Property 
 

 
Public Property Let Transition(Value As Integer) 
 
    mMyProperty = Value 
 
End Property 
 

 

 
Private Sub mclsCbx_Change() 
 

 
      'Options NUM 
 
      Set Lbl4 = UserForm1.Frame1.Controls.Add("Forms.Label.1", "lbl3") 
 
      Set txtB4 = UserForm1.Frame1.Add("Forms.TextBox.1") 
 
      
 
      With txtB4 
 
       .name = "Unit" & mMyProperty 
 
       .Height = 15 
 
       .Width = 50 
 
       .Left = 500 
 
       .Top = 10 * mMyProperty * 3 
 
       .Value = "txtB4NUM" 
 
      End With 
 
      
 
      Lbl4.Caption = "Unité : " 
 
      Lbl4.Top = txtB4.Top 
 
      Lbl4.Left = 360 
 
      
 
      'Options LIST 
 
      Set Lbl3 = UserForm1.Frame1.Controls.Add("Forms.Label.1", "lbl3") 
 
      Set txtB3 = UserForm1.Frame1.Add("Forms.TextBox.1") 
 
      
 
      With txtB3 
 
       .name = "specMin" & mMyProperty 
 
       .Height = 15 
 
       .Width = 200 
 
       .Left = 410 
 
       .Top = 10 * mMyProperty * 3 
 
       .Value = "txtB3LIST" 
 
      End With 
 
      
 
     
 
      Lbl3.Caption = "Eléments : " 
 
      Lbl3.Top = txtB3.Top 
 
      Lbl3.Left = 360 
 
     
 

 
    If (Me.Cbx.Value = "NUM") Then 
 
     txtB3.Visible = False 
 
     txtB4.Visible = True 
 
    
 

 
    Else 
 
     If (Me.Cbx.Value = "LIST") Then 
 
      txtB4.Visible = False 
 
      txtB3.Visible = True 
 
      
 
     End If 
 
    End If 
 

 
End Sub

В коде UserForm, я динамически добавлять такие выпадающие списки:

'Create the combobox 
Set oleCbx = Frame1.Add("Forms.ComboBox.1") 'Bug at this line 

With oleCbx 
    .name = "list" & i 
    .Height = 15 
    .Width = 100 
    .Left = 70 
    .Top = 10 * i * 3 
    .AddItem "NUM" 
    .AddItem "LIST" 
End With 

Set gclsControlEvents = New CControlEvents 
Set gclsControlEvents.Cbx = oleCbx 

Let gclsControlEvents.Transition = i 

проблема заключается в том, что при изменении значения ComboBox, он отображает соответствующие текстовые поля, но это не приводит к удалению других, в то время как

If (Me.Cbx.Value = "LIST") Then 
txtB4.Visible = False 
txtB3.Visible = True 

Предполагается, что одно из текстовых полей должно быть видимым, а другое - невидимым, если значение выпадающего списка является «СПИСОК».

EDIT: Правильные решения этой проблемы были даны @Rory в комментарии.

+0

Почему вы хотите добавить 2 новых ярлыка каждый раз, когда вы изменяете значение в выпадающем списке? – Rory

+0

Это была просто ошибка, каждая метка должна быть прикреплена к текстовому поле и поэтому должна появляться и исчезать вместе с ней. @Rory – otus

+0

В этом проблема. Вы можете скрыть элементы управления, которые вы добавляете каждый раз, но вы не скрываете ранее добавленные элементы управления. Вы должны добавить их в код пользовательской формы и назначить их свойствам класса, тогда вы можете просто скрыть/показать соответственно. – Rory

ответ

0

Установка txtB4.Visible = "False" должна это сделать. Возможно, попробуйте перерисовать форму. Попробуйте их после visible = "false".

UserForm1.Repaint 

Или события, чтобы окна заканчивали любые обновления.

DoEvents 

Если это проверка значения, которая терпит неудачу, попробуйте использовать свойство .Text.

If (Me.Cbx.Text = "LIST") Then 

.Text дает вам то, что отображается.

.Value дает назначенное значение элементу списка.

Distinction between using .text and .value in VBA Access

Обратите внимание на комментарий в этом посте про ComboBox.

+0

Спасибо, но ни одно из этих решений не работает:/ – otus

+0

Итак, вы не получаете ошибок, он просто не скрывает txtbox? Вы уверены, что код работает через этот раздел? – MatthewD

+0

Да, у меня нет ошибок. – otus

Смежные вопросы