FlowLayoutPanel удалить фоновое изображение и удалить файл изображения

Я использую следующий код, чтобы удалить все элементы управления внутри FlowLayoutPanel:

While FlowLayoutPanel1.Controls.Count > 0
    Dim controltoremove = FlowLayoutPanel1.Controls(0)
    FlowLayoutPanel1.Controls.Remove(controltoremove)
    controltoremove.Dispose()
    Application.DoEvents()
End While

Кажется, это работает (так как я больше не вижу свои элементы управления внутри моего окна FlowLayoutPanel1), но как только я доберусь до этой части кода:

My.Computer.FileSystem.DeleteFile("C:\wamp\www\img\" & subitem("id").ToString.Replace("""", "") & ".jpg")

Он говорит мне, что изображение в настоящее время используется??? Поскольку я разместил эти элементы управления (которые имеют эти изображения в качестве фонового изображения), не должен ли я удалить файл изображения ??

Чтобы создать кнопки внутри FlowLayoutPanel, я использую это:

For Each subitem As JObject In item.Values
   Dim newPictureBox As New Button
   Dim Client As New WebClient

   strID = "http://graph.facebook.com/" & subitem("id").ToString.Replace("""", "") & "/picture?width=126&height=114"
   strName = subitem("name").ToString

   Client.DownloadFile(strID, "C:\wamp\www\img\" & subitem("id").ToString.Replace("""", "") & ".jpg")
   Client.Dispose()

   Dim bmp As New Bitmap(Image.FromFile("C:\wamp\www\img\" & subitem("id").ToString.Replace("""", "") & ".jpg"))
   newPictureBox.BackgroundImage = Image.FromFile("C:\wamp\www\img\" & subitem("id").ToString.Replace("""", "") & ".jpg")
   newPictureBox.Tag = subitem("id").ToString.Replace("""", "")
   newPictureBox.Name = "img" & intX
   newPictureBox.Width = bmp.Width.ToString()
   newPictureBox.Height = bmp.Height.ToString()
   FlowLayoutPanel1.Controls.Add(newPictureBox)
   AddHandler newPictureBox.Click, AddressOf newPictureBox_Click
   intX += 1
   imgDir.Add(strName, subitem("id").ToString.Replace("""", ""))
   bmp.Dispose()
Next

И похоже, что проблема заключается в затемнении новой кнопки PictureBox как новой кнопки. если я добавлю

newPictureBox.dispose()

в конце этого кода выше он работает с удалением изображений из каталога... но никогда не отображает изображения внутри кнопок, чтобы начать, когда я это сделаю: o/

Что я буду делать неправильно?


person StealthRT    schedule 18.02.2014    source источник
comment
Вы пробовали FlowLayoutPanel1.Controls.Clear(), это предпочтительнее, чем перебирать элементы управления.   -  person zaggler    schedule 18.02.2014
comment
А затем вызовите Gc.Collect()   -  person zaggler    schedule 18.02.2014
comment
@MrCoDeXeR нет. все еще есть ошибка   -  person StealthRT    schedule 18.02.2014
comment
Ага, тогда что-то еще не так, что, если вы попытаетесь открыть его, не заходя в ваше приложение?   -  person zaggler    schedule 18.02.2014
comment
@MrCoDeXeR Проверьте мой обновленный ОП - нашел причину ... просто нужно знать, как ее исправить.   -  person StealthRT    schedule 18.02.2014
comment
Ах, я вижу, вы добавляете обработчики, но где вы их удаляете? Вы используете их, но если вы их не удалите, у них могут возникнуть проблемы с необработанной памятью.   -  person zaggler    schedule 18.02.2014
comment
@MrCoDeXeR что мне нужно удалить??   -  person StealthRT    schedule 18.02.2014
comment
Вам нужно удалить обработчики, которые вы создали в этом коде, сделайте это в .Dispose в классе, который вы их создаете.   -  person zaggler    schedule 18.02.2014
comment
Выполнение RemoveHandler newPictureBox.Click, AddressOf newPictureBox_Click также не помогает решить проблему...   -  person StealthRT    schedule 18.02.2014
comment
Я собираюсь поставить это в ответ, дай мне минуту   -  person zaggler    schedule 18.02.2014
comment
давайте продолжим это обсуждение в чате   -  person zaggler    schedule 18.02.2014


Ответы (1)


Это определенно сработает для вас, извините за задержку... Убедитесь, что вы также импортируете пространство имен System.IO... Когда вы используете метод Image.FromFile(strFileName) для создания образа, этот метод блокирует файл до тех пор, пока вы не отпустите Изображение. Вместо этого мы можем использовать FileStream для выполнения этой задачи.

 For Each subitem As JObject In item.Values
  Dim newPictureBox As New Button
  Dim Client As New WebClient

  strID = "http://graph.facebook.com/" & subitem("id").ToString.Replace("""", "") & "/picture?width=126&height=114"
  strName = subitem("name").ToString

  Client.DownloadFile(strID, "C:\wamp\www\img\" & subitem("id").ToString.Replace("""", "") & ".jpg")
  Client.Dispose()

  Dim bmp As Bitmap
  Dim strPath As String = "C:\wamp\www\img\" & subitem("id").ToString.Replace("""", "") & ".jpg"

  Using fs As New FileStream(strPath, FileMode.Open, FileAccess.Read)
        Using b As New Bitmap(fs)
            bmp = New Bitmap(b.Width, b.Height, b.PixelFormat)
            Using g As Graphics = Graphics.FromImage(bmp)
                g.DrawImage(b, Point.Empty)
                g.Flush()
            End Using
        End Using
  End Using     

  newPictureBox.BackgroundImage = bmp
  newPictureBox.Tag = subitem("id").ToString.Replace("""", "")
  newPictureBox.Name = "img" & intX
  newPictureBox.Width = bmp.Width.ToString()
  newPictureBox.Height = bmp.Height.ToString()
  FlowLayoutPanel1.Controls.Add(newPictureBox)
  AddHandler newPictureBox.Click, AddressOf newPictureBox_Click
  intX += 1
  imgDir.Add(strName, subitem("id").ToString.Replace("""", ""))

 Next
person zaggler    schedule 18.02.2014
comment
:o( тоже не сработало. Это связано с кнопкой Затемнить newPictureBox как новую. - person StealthRT; 18.02.2014
comment
Вы пытались обернуть свои кнопки в оператор using? - person zaggler; 18.02.2014
comment
он отлично очищает поток. По какой-то причине он просто покидает newPictureBox. Вот от чего мне нужно избавиться. - person StealthRT; 18.02.2014
comment
Пожалуйста, посмотрите правку, это были не кнопки, которые вы создавали, а то, как вы конкретно захватили изображения. Пожалуйста, смотрите обновленный ответ. Также я пробовал и тестировал это с удалением изображений:) - person zaggler; 18.02.2014
comment
Добро пожаловать рад, что смог помочь - person zaggler; 19.02.2014