Как удалить все графические блоки из формы во время выполнения - PullRequest
0 голосов
/ 05 января 2020

У меня динамически создаются ящики для картинок, но я sh хочу удалить их все во время выполнения программы. Я пробовал следующий код VB:

Dim c As Control
For Each c In Form.Controls
    If TypeOf (c) Is PictureBox Then
        Form.Controls.Remove(PictureBox)
    End If
Next

Проблема с этим кодом PictureBox, поскольку это не именованный объект. Я просто хочу удалить ВСЕ картинные коробки из формы.

Ответы [ 2 ]

2 голосов
/ 05 января 2020
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    For Each ctrl In Me.Controls
        Dim pb = TryCast(ctrl, PictureBox)
        If pb IsNot Nothing Then
            Me.Controls.Remove(pb)
        End If
    Next
End Sub
1 голос
/ 06 января 2020

Я бы сделал это следующим образом:

For Each pb In Me.Controls.OfType(Of PictureBox)().ToArray()
    pb.Dispose()
Next

Метод OfType выполняет фильтрацию по типу и поэтому немного убирает код. Вызов ToArray означает, что вы не перечисляете коллекцию, которую вы изменяете в l oop. Вызов Dispose лучше вызова Remove, потому что Dispose неявно удалит, но Remove не удастся неявно удалить.

Если вы закончили с Image в PictureBox, тогда вы следует утилизировать его, что вы можете аккуратно сделать следующим образом:

For Each pb In Me.Controls.OfType(Of PictureBox)().ToArray()
    pb.Image?.Dispose()
    pb.Dispose()
Next

Использует нулевое распространение, поэтому не будет выбрасывать NullReferenceException, если свойство Image равно Nothing. Если в любом случае у этого нет шансов, просто используйте обычный оператор точки. Это нулевое распространение эквивалентно этому:

For Each pb In Me.Controls.OfType(Of PictureBox)().ToArray()
    If pb.Image IsNot Nothing Then
        pb.Image.Dispose()
    End If

    pb.Dispose()
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...