我正在尝试将表单加载为
Dim f as New Form2
f.show()
表单已加载,但它没有显示所有控件。我有两个按钮和两个文本框。按钮和一个文本框都显示为透明。在当前子程序结束之前,表格看起来就像那样。
此外,加载时的表单应显示从数据库中获取的文本,并显示文本(从db等间隔再次获取),除非用户明确关闭应用程序。该逻辑也在Form2_Load事件中。
如何编写逻辑,使form2正确显示并定期从db获取文本。
我正在创建一个类似于医疗保健领域的应用程序的字典。它以两种模式工作。其中一种模式是功能区模式,其中创建表单(表单标记为最顶层),只要应用程序处于活动状态,就应显示术语和定义。因此,您会看到无限循环。用户按下关闭按钮或按X后,应用程序将关闭。
我正在玩代码并将其从Load甚至移动到显示的事件。但问题仍然存在。
Private Sub Form2_Shown(ByVal sender As Object, ByVal e As EventArgs) _
Handles MyBase.Shown
Dim myConnection As OleDbConnection = New OleDbConnection
Dim idSelected, queryGetWordDef, totalRows
Dim rowReturned, queryGetMaxID, provider, ipath, dataFile, connString As String
Dim dict() As String
Dim dr1 As OleDbDataReader
Dim dt As DataTable = New DataTable
provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="
ipath = Application.StartupPath
dataFile = ipath & "\Database\database1.mdb" ' Change it to your Access Database location
connString = provider & dataFile
myConnection.ConnectionString = connString
queryGetMaxID = "SELECT ID FROM Table1"
myConnection.Open()
Dim cmd As OleDbCommand = New OleDbCommand(queryGetMaxID, myConnection)
Try
dr1 = cmd.ExecuteReader()
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
dt.Load(dr1)
totalRows = dt.Rows.Count
While True
idSelected = dt.Rows.Item(CInt(totalRows * Rnd()) + 1)(0)
queryGetWordDef = "SELECT Word & ""@"" & Meaning FROM Table1 WHERE ID = " & CStr(idSelected)
cmd = New OleDbCommand(queryGetWordDef, myConnection)
Try
rowReturned = cmd.ExecuteScalar()
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
dict = rowReturned.Split("@")
Me.txtBoxDefinition.Text = dict(1)
Me.txtBoxTerm.Text = dict(0)
Thread.Sleep(5000)
End While
End Sub
附表的图片更清晰。
答案 0 :(得分:1)
您的Shown
事件处理程序中有无限循环。该代码在UI线程上执行,并且永远不会结束,因此您永远不能在UI线程上执行任何其他操作。
完全摆脱那个循环。如果您想每5秒钟执行一次操作,请使用Timer
,Interval
为5000。
答案 1 :(得分:1)
如上所述,你有一个无限循环。在创建表单之前输入循环。
要实现您的要求,您需要查看backgroundworker
您可以将其与计时器结合使用来触发背景工作者doWork()事件。
该链接还有一个如何更新表单上文本的示例。