Как удалить динамически добавленные пользовательские элементы управления по одному? - PullRequest
1 голос
/ 21 января 2020

Я создаю приложение для регистрации тренировок, которое позволяет пользователю добавлять движение, количество повторений и соответствующий вес во время работы пользовательской формы. (Вы также можете думать об этом как о «подборе заказов», например: «3», «красный», «карандаши», «2», «синие», «маркеры» и т. Д. c.)

. Код добавляет два текстовых поля и поле со списком при нажатии кнопки «+».

При нажатии кнопки «-» будет удалена только последняя добавленная группа элементов управления, но если нажать кнопку «-» снова я получу сообщение об ошибке «Catastrophi c Failure».

Я почти уверен, что эти элементы управления необходимо удалить с помощью controls.remove (object).name, но как только эта последняя группа будет удалена, мне потребуется обновите переменную объекта до следующей группы, которая может быть удалена, с чем я борюсь.

Здесь я нашел похожие вопросы с ответами, но они удалили все элементы управления пользовательской формы. Я хочу удалить только последнюю добавленную группу.

enter image description here

Option Explicit
Public movementCounter As Integer
Public repsTextBox As Object
Public movementComboBox As Object
Public weightTextBox As Object
Public cntrlsColl As Collection

Private Sub addMvmtCmndButt_Click()

    movementCounter = movementCounter + 1

    Set repsTextBox = Controls.Add("Forms.TextBox.1")
    Set movementComboBox = Controls.Add("Forms.ComboBox.1")
    Set weightTextBox = Controls.Add("Forms.TextBox.1")

    With repsTextBox
        .Name = "RepsTextBox" & movementCounter
        .Height = 18
        .Width = 45
        .Left = 10
        .Top = 30 * (movementCounter - 1) + 5
    End With

    With movementComboBox
        .Name = "MovementComboBox" & movementCounter
        .Height = 18
        .Width = 90
        .Left = 65
        .Top = 30 * (movementCounter - 1) + 5
        .RowSource = listsSht.Range("movementList").Address
    End With

    With weightTextBox
        .Name = "WeightTextBox" & movementCounter
        .Height = 18
        .Width = 45
        .Left = 165
        .Top = 30 * (movementCounter - 1) + 5
    End With

End Sub

Private Sub deleteMvmtCmndButt_Click()

'Works, but only for the most recently added group of controls
    With Me.Controls
        .Remove repsTextBox.Name
        .Remove movementComboBox.Name
        .Remove weightTextBox.Name
    End With

'update what the next group of controls will be on-deck
'    If movementCounter > 0 Then
'        repsTextBox.Name = "RepsTextBox" & movementCounter
'        movementComboBox.Name = "MovementComboBox" & movementCounter
'        weightTextBox.Name = "WeightTextBox" & movementCounter
'    End If

End Sub

1 Ответ

1 голос
/ 21 января 2020

Попробуйте следующий код ...

Private Sub deleteMvmtCmndButt_Click()

    If movementCounter > 0 Then
        With Me.Controls
            .Remove "RepsTextBox" & movementCounter
            .Remove "MovementComboBox" & movementCounter
            .Remove "WeightTextBox" & movementCounter
        End With
        movementCounter = movementCounter - 1
    End If

End Sub

Надеюсь, это поможет!

...