加载表单时控件未显示

时间:2015-10-13 09:43:13

标签: vb.net

我正在尝试将表单加载为

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

附表的图片更清晰。

enter image description here

2 个答案:

答案 0 :(得分:1)

您的Shown事件处理程序中有无限循环。该代码在UI线程上执行,并且永远不会结束,因此您永远不能在UI线程上执行任何其他操作。

完全摆脱那个循环。如果您想每5秒钟执行一次操作,请使用TimerInterval为5000。

答案 1 :(得分:1)

如上所述,你有一个无限循环。在创建表单之前输入循环。

要实现您的要求,您需要查看backgroundworker

您可以将其与计时器结合使用来触发背景工作者doWork()事件。

该链接还有一个如何更新表单上文本的示例。