【问题标题】:VB.NET Backgroundworker only show loading form once?VB.NET Backgroundworker 只显示一次加载表单?
【发布时间】:2015-12-10 21:39:18
【问题描述】:

我在一个表单上有一个按钮,它基本上从我的数据库中获取数据,如下所示。

Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs)
                                   Handles ToolStripButton1.Click
    BackgroundWorker1.RunWorkerAsync()
    Loading_Screen.ShowDialog()
End Sub

在后台工作程序中运行我的代码(从数据库中获取数据)后调用加载屏幕。 后台工作人员完成后,我关闭加载表单,如下所示

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) 
                             Handles BackgroundWorker1.RunWorkerCompleted
    DataGridView1.DataSource = bSource
    SDA.Update(dataTable)
    ToolStripLabel1.Text = "RESULT : " + DataGridView1.RowCount.ToString
    Loading_Screen.Close()
End Sub

这仅在我第一次启动应用程序时有效。每当我再次单击该按钮时,加载表单将不再显示,但代码仍然运行良好。有什么想法吗?

加载表单完全没有代码,只是每次加载时运行的进度条。

我做了什么,但没有运气:

  1. Me.Refresh() 调用加载表单后的主表单。
  2. Me.Refresh() 加载表单时加载函数。
  3. 尝试使用 loadingform.hide() 而不是 show()
  4. show() 和 showdialog() 都试过了
  5. 尝试创建加载表单的新实例。
  6. Me.dispose() 在关闭函数时加载表单
  7. Me.dispose() 关闭函数的主要形式
    1. 将加载表单设置为最顶层。

更新(我会在这里不断更新我的进度)

正如你们中的许多人要求创建一个新实例,这就是我已经做的

Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
    BackgroundWorker1.RunWorkerAsync()
    ldScreen = New Loading_Screen()
    ldScreen.ShowDialog()
    Me.Refresh()
End Sub

然后,在运行完成时,

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    DataGridView1.DataSource = bSource
    SDA.Update(dataTable)
    ToolStripLabel1.Text = "RESULT : " + DataGridView1.RowCount.ToString
    ldScreen.Close()
    BackgroundWorker1.Dispose()
End Sub

在我的加载表单中,代码只有这个

Private Sub Loading_Screen_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    Me.Dispose()
End Sub

Private Sub Loading_Screen_Load(sender As Object, e As EventArgs) Handles Me.Load
    Me.Refresh()
End Sub

更新 2

通过剥离我的大部分代码并将系统线程睡眠置于 backgroundworker 中,加载表单可以正确显示。所以这是我在 backgroundworkerdowork 中关于实际发生的事情的代码。

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Connect2Database()
    Try
        sqlCommand.CommandText = "Select * from kup_table" 'Load full database into gridview
        SDA.SelectCommand = sqlCommand
        SDA.Fill(dataTable)
        bSource.DataSource = dataTable
        mySqlConn.Close()
    Catch ex As MySqlException
        MsgBox(ex.ToString)
        If mySqlConn.State = ConnectionState.Open Then
            mySqlConn.Close()
        End If
    Finally
        mySqlConn.Dispose()
    End Try
    'System.Threading.Thread.Sleep(2000)
End Sub

这里是 Connect2Database 功能代码

Private Sub Connect2Database()
    sqlCommand = New MySqlCommand
    dataTable = New DataTable
    SDA = New MySqlDataAdapter
    bSource = New BindingSource
    Try
        dataTable.Clear()
        mySqlConn.ConnectionString = connString
        sqlCommand.Connection = mySqlConn
        mySqlConn.Open()
    Catch ex As MySqlException
        MsgBox(ex.ToString)
        If mySqlConn.State = ConnectionState.Open Then
            mySqlConn.Close()
        End If
    End Try
End Sub

更新 3

我注意到当我的System.Threading.Thread.Sleep(2000)没有被评论时,加载屏幕会正常显示。但如果我将其更改为System.Threading.Thread.Sleep(1),加载屏幕不会出现。为什么会这样?第一次后代码运行速度超快?

【问题讨论】:

  • @bonCodigo 看看吧。这似乎与我的问题无关。在后台工作人员做工作,我只做我的代码的东西。与视觉外观无关。
  • Loading_Screen 是您要显示的表单类的实际实例,还是只是对类型本身的引用。
  • @DavidY 不确定你的意思。我将 ldscreen 作为新的 Loading_Screen 然后 ldscreen.ShowDialog()。在 Loading_Screen_FormClosing 中我写了 me.dispose()。在主窗体 backgroundworker_runco​​mpleted 我只是在末尾添加 ldscreen.close()
  • Close() 调用分配了 Loading_Screen.DialogResult 属性。您忘记将其设置回无。只是不要这样做,无缘无故地保留表单对象是浪费。在需要时使用 new 操作符创建一个新的。并在不再需要时调用 Dispose()。
  • @HansPassant 如何将其设置回无?顺便说一句,我已经用我所做的更新了这个问题。我现在这样做对吗?

标签: vb.net forms visual-studio-2015 backgroundworker loading


【解决方案1】:

这是因为调用Close() 会处理表单。所以要么你必须每次都创建一个新的表单实例,要么你需要使用Hide()。从你的问题来看,我认为你想要前者。

【讨论】:

  • 在我的加载表单 onClosing 函数中,我放了 me.hide() 但仍然无法再次显示表单。总是显示第一次运行。第二次点击按钮不显示
  • 也尝试创建新实例。但不工作。
【解决方案2】:

您是否尝试过创建表单的新实例?

Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click Dim frm As New Loading_Screen BackgroundWorker1.RunWorkerAsync() frm.ShowDialog() End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多