В основном я пытаюсь отображать различные наборы текстовых полей в пользовательской форме в зависимости от значения, полученного с помощью 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 в комментарии.
Почему вы хотите добавить 2 новых ярлыка каждый раз, когда вы изменяете значение в выпадающем списке? – Rory
Это была просто ошибка, каждая метка должна быть прикреплена к текстовому поле и поэтому должна появляться и исчезать вместе с ней. @Rory – otus
В этом проблема. Вы можете скрыть элементы управления, которые вы добавляете каждый раз, но вы не скрываете ранее добавленные элементы управления. Вы должны добавить их в код пользовательской формы и назначить их свойствам класса, тогда вы можете просто скрыть/показать соответственно. – Rory