更改面板的可见性(Windows窗体)

时间:2020-07-17 13:52:45

标签: vb.net windows-forms-designer

我把它留给你,因为我找不到解决问题的方法:/

让我解释一下,当我按下一个按钮时,我会显示一个包含其他按钮的面板,单击面板上的按钮之一,它应该会启动一种将所选文件转换为pdf的方法。用户单击其中一个按钮并确认选择文件后,我使面板不可见,然后启动转换方法。

问题在于我的面板消失了,可以说是一半(不是全部),因为它以最快的速度启动了转换方法。我告诉自己,我要通过第二个线程,但是我无法修改第二个线程上的图形元素。

有我的代码:

 Private Sub PBFolder_Click(sender As Object, e As EventArgs) Handles PBFolder.Click
    Try
        Insert2Db("Debut de la fonction BTransforme_Click " + Environment.UserName.ToString, 1, 0, "ConvertFiles2PDF")
        'Log("Debut de la fonction BTransforme_Click")
        Dim OFD As New FolderBrowserDialog
        If OFD.ShowDialog = Windows.Forms.DialogResult.OK Then

            PanFileFolder.Visible = False

            ConvertFileFolder(False, OFD.SelectedPath.ToString)

        End If

    Catch ex As Exception
        'Log("Error " + ex.Message)
        Insert2Db("Error " + ex.Message + "User : " + Environment.UserName.ToString, 0, 3, "ConvertFiles2PDF")
    Finally
        Insert2Db("function BTransforme_Click Terminé " + Environment.UserName.ToString, 1, 0, "ConvertFiles2PDF")
        'Log("function BTransforme_Click Terminé")
    End Try
    LAppOne.Visible = True
    GifLoad.Visible = False
    Button1.Enabled = True
    BLog.Enabled = True

End Sub

如您所见,由于以下行,我隐藏了面板: PanFileFolder.Visible = False ,然后启动转换方法 convertFileFolder(False,OFD.SelectedPath.ToString)

我放置了2张图像来说明我的问题。 第一张图片显示单击时出现的面板: After launch method

第二张图片向您展示了导致我选择文件夹的问题: Problem panel visible

完成文件转换后,此时面板将正确消失。 您有解决此问题的想法吗?谢谢!)

1 个答案:

答案 0 :(得分:0)

我告诉自己,我要经历一个辅助线程, 但是我无法在第二个线程上修改图形元素。

这正是解决您的问题的方法; ConvertFileFolder()需要在其他线程中运行,以便GUI可以刷新自身并响应用户交互。您可以使用Invoke()调用从该辅助线程更新GUI。

在这里,我已将Async添加到Button单击处理程序中,然后我们Await ConvertFileFolder()函数,该函数现在返回Task

Private Async Sub PBFolder_Click(sender As Object, e As EventArgs) Handles PBFolder.Click

    ' ... other code ...

    Using OFD As New FolderBrowserDialog
        If OFD.ShowDialog = DialogResult.OK Then
            PanFileFolder.Visible = False
            Await ConvertFileFolder(False, OFD.SelectedPath.ToString)
        End If
    End Using

    ' ... other code ...

End Sub

Public Function ConvertFileFolder(ByVal someFlag As Boolean, ByVal someString As String) As Task
    Return Task.Run(Sub()

                        ' ... long running code in here ...

                        For i As Integer = 1 To 10

                            System.Threading.Thread.Sleep(1000) ' some "work"

                            ' whenever you need to update the GUI, use Invoke()
                            Dim value As String = i.ToString
                            Me.Invoke(Sub()

                                          Label1.Text = value

                                      End Sub)

                        Next

                    End Sub)
End Function
相关问题