【发布时间】: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
这仅在我第一次启动应用程序时有效。每当我再次单击该按钮时,加载表单将不再显示,但代码仍然运行良好。有什么想法吗?
加载表单完全没有代码,只是每次加载时运行的进度条。
我做了什么,但没有运气:
- Me.Refresh() 调用加载表单后的主表单。
- Me.Refresh() 加载表单时加载函数。
- 尝试使用 loadingform.hide() 而不是 show()
- show() 和 showdialog() 都试过了
- 尝试创建加载表单的新实例。
- Me.dispose() 在关闭函数时加载表单
- Me.dispose() 关闭函数的主要形式
- 将加载表单设置为最顶层。
更新(我会在这里不断更新我的进度)
正如你们中的许多人要求创建一个新实例,这就是我已经做的
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_runcompleted 我只是在末尾添加 ldscreen.close()
-
Close() 调用分配了 Loading_Screen.DialogResult 属性。您忘记将其设置回无。只是不要这样做,无缘无故地保留表单对象是浪费。在需要时使用 new 操作符创建一个新的。并在不再需要时调用 Dispose()。
-
@HansPassant 如何将其设置回无?顺便说一句,我已经用我所做的更新了这个问题。我现在这样做对吗?
标签: vb.net forms visual-studio-2015 backgroundworker loading