1

我被卡住了,不知道该怎么办,我正在尝试制作一个image viewer,并将imageby 文件夹的所有路径放在 a 中listbox,然后当我尝试在列表中选择时index 2,我收到错误并显示“OutOfMemoryException”

这是我的代码

Public Class Form1
Dim myimg As Array
Private Sub img_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles img.Click
    If FolderBrowserDialog1.ShowDialog = DialogResult.OK Then
        myimg = IO.Directory.GetFiles(FolderBrowserDialog1.SelectedPath)
        ListBox1.Items.AddRange(myimg)
        ListBox1.SelectedIndex = 0
    End If
End Sub

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    Me.Refresh()
    Me.BackgroundImage = Nothing
    Me.BackgroundImage = Image.FromFile(ListBox1.SelectedItem.ToString)
End Sub

Private Sub min_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles min.Click
    Me.WindowState = FormWindowState.Maximized
End Sub

Private Sub max_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles max.Click
    Me.WindowState = FormWindowState.Normal
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub
End Class

错误位于此处

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    Me.Refresh()
    Me.BackgroundImage = Nothing
    Me.BackgroundImage = Image.FromFile(ListBox1.SelectedItem.ToString)
End Sub

,请帮忙谢谢:)

4

2 回答 2

2

您可能在列表中没有有效的图像文件。寻找异常:

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) _
                                          Handles ListBox1.SelectedIndexChanged
  Try
    If ListBox1.SelectedIndex > -1 Then
      Me.BackgroundImage = Image.FromFile(ListBox1.SelectedItem.ToString)
    End If
  Catch ex As OutOfMemoryException
    'not a valid image file
  End Try
End Sub

要过滤列表,您可以执行以下操作:

Using fbd As New FolderBrowserDialog
  If fbd.ShowDialog = DialogResult.OK Then
    myimg = IO.Directory.GetFiles(fbd.SelectedPath).Where( _
                         Function(x) x.ToLower.EndsWith("bmp") _
                                  Or x.ToLower.EndsWith("png")).ToArray

    ListBox1.Items.AddRange(myimg)
    ListBox1.SelectedIndex = 0
  End If
End Using
于 2013-10-04T12:35:35.827 回答
1

这可能是您的问题开始的地方:

Private Sub img_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles img.Click
  If FolderBrowserDialog1.ShowDialog = DialogResult.OK Then
     myimg = IO.Directory.GetFiles(FolderBrowserDialog1.SelectedPath)
     ListBox1.Items.AddRange(myimg)
     ListBox1.SelectedIndex = 0
  End If
End Sub

因此,在他们从您的选择之前ListBox

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
  Me.Refresh()
  Me.BackgroundImage = Nothing
  Me.BackgroundImage = Image.FromFile(ListBox1.SelectedItem.ToString)
End Sub

为什么不将可以显示在您的图像的大小限制为ListBox5MB 例如:

Private Sub img_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles img.Click
  If FolderBrowserDialog1.ShowDialog = DialogResult.OK Then
     myimg = IO.Directory.GetFiles(FolderBrowserDialog1.SelectedPath)
     For Each imgfile As String In myimg
         Dim allowedImgFile As New System.IO.FileInfo(imgfile)
         If ((allowedImgFile.Length / 1024) <= 5) Then
            ListBox1.Items.Add(imgfile)
         End If
     Next
     ListBox1.SelectedIndex = 0
  End If
End Sub

您需要通知您的用户,但只有 5MB 或更小(或您喜欢的任何大小)的图像才会显示在列表中。

于 2013-10-04T13:24:48.680 回答