使用vb.net将图像列表加载到列表框时添加进度条
我正在尝试使用“打开文件”对话框和“文件夹浏览”对话框添加图像,并将图像列表填充到列表框中。添加这些图像时,我需要显示加载的每个图像的进度条 我正试图得到它,但当进度条的值在25或40左右时,它将在该点停止,但我需要显示进度条,直到它完成100%,然后填充图像列表 我该怎么做 这是我的密码:使用vb.net将图像列表加载到列表框时添加进度条,vb.net,progress-bar,Vb.net,Progress Bar,我正在尝试使用“打开文件”对话框和“文件夹浏览”对话框添加图像,并将图像列表填充到列表框中。添加这些图像时,我需要显示加载的每个图像的进度条 我正试图得到它,但当进度条的值在25或40左右时,它将在该点停止,但我需要显示进度条,直到它完成100%,然后填充图像列表 我该怎么做 这是我的密码: Private Sub AddImages_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Add
Private Sub AddImages_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddImages.Click
If Not Directory.Exists(Application.StartupPath + "\Backup\") = True Then
Directory.CreateDirectory(Application.StartupPath + "\Backup\")
End If
OpenFileDialog1.FileName = "Select a Image"
OpenFileDialog1.Multiselect = True
OpenFileDialog1.InitialDirectory = "C:\Users\Public\Pictures\Sample Pictures"
OpenFileDialog1.Filter = "All Type Of Image Files|*.*|Joint Photographic Experts Group [JPEG]|*.jpg|Bitmap [BMP|*.bmp|Tagged Image File Format [TIFF]|*.tiff|Portable Network Graphics [PNG]|*.png"
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
ProgressBar2.Show()
ProgressBar2.Step = 10
Dim str As String
For Each str In OpenFileDialog1.FileNames
Load.Text = "Loading..."
Dim fso As New FileSystemObject
Dim MyName As String
Dim MyExtension As String
MyName = fso.GetFileName(CStr(str))
MyExtension = fso.GetExtensionName(MyName)
System.IO.File.Copy(str, Application.StartupPath + "\Backup\" + MyName & "." & MyExtension, True)
CheckedListBox1.Items.Add(str, CheckState.Checked)
Thumbcontrol1.AddThumbnail(str)
Thumbcontrol1.BackgroundImage = Nothing
CheckedListBox1.SelectedIndex = 0
ProgressBar2.PerformStep()
Next
SaveProject.Enabled = True
Delete.Enabled = True
Edit.Enabled = True
ClearAll.Enabled = True
CheckAll.Enabled = True
UncheckAll.Enabled = True
Timer1.Stop()
Load.Text = "Loading Completed"
Else
End If
ProgressBar2.Visible = False
Load.Text = Nothing
End Sub
不要使用UI进行加载。使用后台工作程序。BackgroundWorker在另一个线程中工作,它可以报告进度以将其绑定到进度条。进度条停止移动,因为Windows认为您的程序有严重错误。它将主窗口替换为“重影”窗口,因为标题栏上显示“无响应” 它这样做是为了帮助提醒用户,您的程序对世界来说是死的,不会响应用户的任何输入。点击鼠标或敲击键盘不会产生任何效果,用户所能做的就是在代码运行时无助地观看
这并不是一个理想的用户界面。您可以通过使用BackgroundWorker来解决这个问题,以便在单独的线程上完成繁重的工作。让用户界面线程响应。请务必阅读MSDN文章,以便知道该怎么做,您必须调整代码。删除
ProgressBar2.Step=10
行,然后执行以下操作:
Dim str As String
Dim counter As Integer 'new!
For Each str In OpenFileDialog1.FileNames
Load.Text = "Loading..."
Dim fso As New FileSystemObject
Dim MyName As String
Dim MyExtension As String
MyName = fso.GetFileName(CStr(str))
MyExtension = fso.GetExtensionName(MyName)
System.IO.File.Copy(str, Application.StartupPath + "\Backup\" + MyName & "." & MyExtension, True)
CheckedListBox1.Items.Add(str, CheckState.Checked)
Thumbcontrol1.AddThumbnail(str)
Thumbcontrol1.BackgroundImage = Nothing
counter += 1 'new
CheckedListBox1.SelectedIndex = 0
ProgressBar2.Value = (counter * 100) / OpenFileDialog1.FileNames.Length 'new
Next
它没有解决不使用线程的问题,正如其他答案所指出的那样。我不明白。您正在将每个文件的
ProgressBar2
值增加10(在OpenFileDialog1.FileNames
中)。你怎么知道有多少文件?它可能是2或20-您没有检查它。为什么不忘记步骤
,在循环中添加一个计数器(跟踪加载了多少文件),然后调用ProgressBar2.Value=(计数器*100)/OpenFileDialog1.FileNames
而不是PerformStep
是的,这就是我的想法,但实际上我们不知道它们可以添加多少,当我添加时,它给我的错误是运算符“/”没有为类型“Double”和“一维字符串数组”定义。我的错误,请尝试ProgressBar2.Value=(计数器*100)/OpenFileDialog1.FileNames.Length
当然可以。OpenFileDialog1.FileNames
返回用户选择的文件名数组。它的Length
属性将返回许多文件名。您需要将已加载的文件数除以文件总数。