Динамически создавать и удалять элементы управления из формы много раз

Приведенная ниже подпрограмма при вызове с помощью щелчка мыши успешно создает, а затем удаляет элемент управления. но он не создает его во второй раз. Я предполагаю, что это связано с тем, что метка больше не является общедоступной. т.е. Dim lblDebug1 As New Label находится в верхней части формы. Однако, когда я помещаю Dim lblDebug1 As New Label в подпрограмму, запрос на удаление не работает. Есть ли способ, которым я могу продолжать создавать и удалять элементы управления?

В приведенном ниже подразделе booleanDebug используется для переключения между его созданием и удалением. Спасибо заранее.

Dim lblDebug1 As New Label

booleanDebug = Not booleanDebug
  If booleanDebug Then
      Me.Controls.Add(lblDebug1)
      lblDebug1.BackColor = Color.BlueViolet
  Else
      lblDebug1.Dispose()
  End If

person David K    schedule 17.09.2013    source источник


Ответы (2)


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

Вот пример кода, который работал у меня. Сначала просто создайте новую форму окна, затем добавьте элемент управления кнопкой в ​​середине формы, а затем используйте следующий код.

Public Class Main
Private labelDemo As Windows.Forms.Label

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.SuspendLayout()

    If labelDemo Is Nothing Then

        labelDemo = New Windows.Forms.Label
        labelDemo.Name = "label"
        labelDemo.Text = "You Click the Button"
        labelDemo.AutoSize = True
        labelDemo.Left = 0
        labelDemo.Top = 0
        labelDemo.BackColor = Drawing.Color.Violet
        Me.Controls.Add(labelDemo)

    Else
        Me.Controls.Remove(labelDemo)
        labelDemo = Nothing
    End If

    Me.ResumeLayout()

End Sub
End Class
person jcwrequests    schedule 18.09.2013
comment
Я поставил Public lblDebug1 As New Label вверху формы, но я думаю, что Dim.. также сделал его глобальным. Я поместил lblDebug1.Visible = True в список свойств, которые нужно установить. Однако, как и раньше, если сначала создать его, затем избавиться от него, а затем, когда он снова начал создавать его, он сказал, что я не могу изменить видимость объекта Disposed. То есть после того, как он выполнил Me.Controls.Add(lblDebug1) - person David K; 18.09.2013
comment
Находится ли оператор Dim внутри метода или он объявлен в другом месте, возможно, где-то в верхней части формы? - person Chris Dunaway; 18.09.2013
comment
Извините за задержку... @Christ, когда Public lblDebug1 As New Label находится в верхней части формы, подпрограмма успешно создает, а затем удаляет элемент управления. но он не создает его во второй раз. Когда Dim lblDebug1 As New Label находится в подпрограмме, запрос на удаление не работает. @jcwrequests, я разместил его на Gist, вот ссылка gist.github.com/Dave1235/6633144 . Он называется CreateDisposeCreatelabel. Однако я не уверен, что сделал это правильно. заранее спасибо - person David K; 20.09.2013
comment
Хорошо, я думаю, что понял, и когда я сяду на свой ноутбук, я соберу для вас код. Сейчас я на своем планшете. - person jcwrequests; 21.09.2013
comment
Я пересмотрел свой ответ, дайте мне знать, могу ли я добавить что-нибудь еще, чтобы сделать его более ясным. - person jcwrequests; 21.09.2013
comment
Спасибо jcw. Похоже, вы пытаетесь научить меня некоторым хорошим привычкам программирования, пока вы это делаете :). Если я правильно понимаю, использование ничего лучше, чем переключение флага, потому что у вас меньше мячей в воздухе. Я не знал о приостановке макета, это хорошо знать. Я относительно новичок в этом. Спасибо еще раз. - person David K; 21.09.2013
comment
Без проблем. В такой ситуации я часто нахожу, что проще просто проверить объект или элемент управления ни за что. Кстати, это решило вашу проблему? - person jcwrequests; 21.09.2013

После того, как вы удалили элемент управления, вы больше не можете его использовать. Здесь у вас есть два варианта:

Вариант 1. Просто удалите элемент управления из формы, а не удаляйте его:

'Top of the file
Dim lblDebug1 As New Label

'Button click
booleanDebug = Not booleanDebug
If booleanDebug Then 
    lblDebug1.BackColor = Color.BlueViolet
    Me.Controls.Add(lblDebug1)       
Else
    Me.Controls.Remove(lblDebug1)
End If

Вариант 2. Каждый раз создавайте новый объект управления.

'Top of the file
Dim lblDebug1 As Label
'               ^   No "New". 
'We just want an object reference we can share at this point, no need for an instance yet

'Button click
booleanDebug = Not booleanDebug
If booleanDebug Then
    lblDebug1 = New Label()
    lblDebug1.BackColor = Color.BlueViolet
    Me.Controls.Add(lblDebug1)
Else
    lblDebug1.Dispose()
End If
person Joel Coehoorn    schedule 20.09.2013
comment
Спасибо за уделенное время, Джоэл. Вариант 2 похоже, что он удовлетворит мои потребности. - person David K; 21.09.2013