进度条 - 显示下一行之前

时间:2015-10-06 11:58:32

标签: vb.net

有一些代码将文件上传到FTP,它需要一些时间才能结束并到达下一行代码。与此同时,我想显示一个进度条和冻结窗口表单,直到它完成。如何实现?

WinScp.PutFile(File, destFP, True)           '<---this line taking some time

    'Progress bar here till it reach next line...

    If Not lsbxPicPaths.Items.Contains(destFP) Then    
        lsbxPicPaths.Items.Add(destFP)
    Else
    ...

有待进一步讨论

在open.Session之前我添加了:

AddHandler session.FileTransferProgress, AddressOf SessionFileTransferProgress
工作人员创建于

以下:

Function GetFile(source As String, destination As String, Optional removeSource As Boolean = False)
            Dim result As Boolean = True
            Try



                session.GetFiles(source, destination, removeSource).Check()




            Catch ex As Exception
                result = False
                'Logger.LogIt(Alert.Write(MsgType.ERROR), Eng.Write(EngType.COLLEC), Datasource.ToString & " | " & Me.reportName & " | " & ex.ToString, LogPath, isDebug)
            End Try
            Return result
        End Function

        Private Shared Sub SessionFileTransferProgress(sender As Object, e As FileTransferProgressEventArgs)
            'Print transfer progress
            _lastProgress = e.FileProgress

        End Sub

        Public Shared _lastProgress As Integer

    then calling like this:

      Me.Cursor = Cursors.WaitCursor
                                WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True)


          form.ProgressBar1.Value = 0
                                ProgressBar1.Show()

                                Do
                                    ProgressBar1.Value = WinScpOperation._lastProgress
                                    ProgressBar1.Refresh()
                                Loop Until ProgressBar1.Value = 1



                                Me.Cursor = Cursors.Default

但是除此之外,我想显示自定义表单,当它上面有进度条,并且会在获取文件和显示进度时显示,然后解压并解锁父表单。我不知道如何将价值传递给我动态表格的进度条。我试着这样开始改变我现在的代码:

Me.Cursor = Cursors.WaitCursor
                            WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True)


                            Dim form As New Form
                            Dim pb As New ProgressBar
                            pb.Minimum = 0
                            pb.Maximum = 1

                            form.ShowDialog()




'pass value to progress bar
                            form.ProgressBar1.Value = 0




                            ' ProgressBar1.Hide()
                            'ProgressBar1.Value = 0

form.Close()



                            Me.Cursor = Cursors.Default

进一步讨论nr.2

新表单:

Public Class FrmProgressBarWinscp

    Property value As Integer

    Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.


        value = 0
        ProgressBar1.Value = 0
        ProgressBar1.Show()

    End Sub

    Sub Run()


        Do
            ProgressBar1.Value = value
            ProgressBar1.Refresh()
        Loop Until value = 1
        MsgBox("Done")
        'ProgressBar1.Hide()
        'ProgressBar1.Value = 0
    End Sub


End Class

以及原始形式:

WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True)

 Dim pro As New FrmProgressBarWinscp()
                            pro.ShowDialog()

                            Do
                                pro.value = WinScpOperation._lastProgress
                                pro.Run()
                            Loop Until WinScpOperation._lastProgress

                            Me.Cursor = Cursors.Default

2 个答案:

答案 0 :(得分:0)

我之前从未使用过这个,但在WINSCP website上看了一下之后,这可能会奏效。您可能需要更多地调查它以使其正常工作。

如果文件传输在自己的线程中运行并且没有冻结ui,请尝试使用

向表单添加进度条控件 将minimum属性设置为0 将maximum属性设置为1 将visible属性设置为false 在您要显示进度条的位置,插入类似

的代码
progressbar1.value=0
progressbar1.show
Do
    progressbar1.value=winscp.FileProgressEventArgs.FileProgress
    progressbar1.refresh
until progressbar1.value=1
progressbar1.hide
progressbar.value=0

您可能需要为Do / Loop终止选择不同的条件,例如如果WINSCP在文件完成时将标志更改为True,并且如果传输失败则需要终止循环。

答案 1 :(得分:0)

我不是使用dim来创建表单,而是使用visual studio的add new item添加表单 - 右键单击​​右侧的Project名称(不是解决方案名称)即可访问该表单。弹出上下文菜单。选择“添加”,然后单击“新建项目”,并选择与项目类型相同的相应表单。

将progressBar添加到表单 - 如果需要,可以将名称保留为progressBar1,但如果更改,则需要在下面的代码中更改对它的引用

在新表单代码的最顶部添加您用于导入winscp内容的相同导入行。

将此代码块(与更新后的问题中的代码类似)放入新表单中。我已经编辑了一些代码,因此它应该以动态形式工作。

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles Me.Load
    Me.Cursor = Cursors.WaitCursor
    WinScp.GetFile(myremotePicturePath, ladujZdjeciaPath, True)
    progressBar1.Minimum = 0
    progressBar1.Maximum = 1
    progressBar1.Value = 0
    Do
        progressBar1.value=winscp.FileProgressEventArgs.FileProgress
        progressbar1.refresh
    until progressbar1.value=1
    Me.Cursor = Cursors.Default
    form.Close()
End Sub

例如Form1.myremotePicturePath和Form1.ladujZdjeciaPath。

此外,您最初在原始表单中定义函数和这两个变量,您需要将它们从Private更改为Public,以便新表单可以看到它们

我认为应该这样做。如果你有任何问题让我知道,但我不会在接下来的几天回家,所以我可能不会回复到深夜 - 有点像今晚:))