vb.net使用string作为先前创建的对象实例

时间:2009-08-09 03:42:23

标签: vb.net

我不确定我需要做些什么来完成这项工作,所以我的描述可能一开始就缺乏。基本上我正在编写一个程序启动器,每次加载时都会重新创建。它从SQLite数据库中提取有关选项卡和按钮的数据,并在运行时动态构建自身。当我将选项卡名称传递给创建按钮的函数时,我遇到了问题。我需要从数据库中提取正确的按钮组的名称然后我尝试使用该名称在创建它们时将按钮放在右侧选项卡上,但调试器将其称为空引用,因为它没有正确指向到我试图指出的标签页(至少这是我猜的)。关于如何使这项工作正确的任何想法?

Private Sub CreateTabs()
    Dim SQLconnect As New SQLite.SQLiteConnection()
    Dim SQLcommand As SQLiteCommand
    SQLconnect.ConnectionString = "Data Source=" & sPath & "\dock.db;"
    SQLconnect.Open()
    SQLcommand = SQLconnect.CreateCommand
    SQLcommand.CommandText = "SELECT title FROM tabs"
    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader()
    Dim Tabs(25) As String
    Dim c As Integer = 1
    While SQLreader.Read()
        Tabs(c) = SQLreader(0)
        c = c + 1
    End While
    SQLcommand.Dispose()
    SQLconnect.Close()
    For i = 1 To UBound(Tabs)
        If Tabs(i) <> "" Then
            Launcher.TabPages.Add(Tabs(i))
            CreateButtons(Tabs(i))
        End If
    Next
End Sub

Private Sub CreateButtons(ByVal tab)
    Dim SQLconnect As New SQLite.SQLiteConnection()
    Dim SQLcommand As SQLiteCommand
    SQLconnect.ConnectionString = "Data Source=" & sPath & "\dock.db;"
    SQLconnect.Open()
    SQLcommand = SQLconnect.CreateCommand
    SQLcommand.CommandText = "SELECT id,name,path FROM buttons WHERE tab = '" & tab & "'"
    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader()
    While SQLreader.Read()
        For i = 1 To 9
            Dim NewButton(i) As Button
            If Not SQLreader(2) Is System.DBNull.Value Then
                Dim myIcon As System.Drawing.Icon = Icon.ExtractAssociatedIcon(SQLreader(2))
            End If
            Dim toolTip1 As ToolTip = New System.Windows.Forms.ToolTip(Me.components)
            Me.Controls(tab).tabpages.add(NewButton(i)) '<--this causes my problem
            'NewButton(i).Width = 32
            'NewButton(i).Height = 32
            'NewButton(i).Text = i
            'NewButton(i).Image = myIcon.ToBitmap
            'If Not SQLreader(1) Is System.DBNull.Value Then
            'toolTip1.SetToolTip(NewButton(i), SQLreader(1))
            'toolTip1.Active = True
            'End If
        Next
    End While
    SQLcommand.Dispose()
    SQLconnect.Close()
End Sub

2 个答案:

答案 0 :(得分:0)

我认为你在这里遇到两个问题:

  • 您正试图通过标签名称找到标签控件。您应该找到选项卡控件本身(或将其传入)并找到控件中 选项卡的名称。否则,您尝试将按钮添加到标签页集合,而不是添加到特定标签页。

  • 您实际上从未创建新按钮。您正在为循环的每次迭代创建一个数组按钮,但不是新的实际Button对象。不可否认,这并不是因为你怀疑它是由标签页引起的,但这肯定是一个问题......

怀疑您希望将此作为循环(其中tabControl是传递的TabControl):

While SQLreader.Read()
    For i = 1 To 9
        If Not SQLreader(2) Is System.DBNull.Value Then
            Dim myIcon As Icon = Icon.ExtractAssociatedIcon(SQLreader(2))
        End If
        Dim toolTip1 As ToolTip = New ToolTip(Me.components)
        Dim NewButton As Button = New Button
        NewButton.Width = 32
        NewButton.Height = 32
        NewButton.Text = i
        NewButton.Image = myIcon.ToBitmap
        tabControl.TabPages(tab).Controls.Add(NewButton)
        If Not SQLreader(1) Is System.DBNull.Value Then
            toolTip1.SetToolTip(NewButton, SQLreader(1))
            toolTip1.Active = True
        End If
    Next
End While

希望这是对的 - 我的VB.NET并不好......

我对编译的原始代码感到惊讶 - 你有Option Strict吗?

您还应该为命令和连接使用Using语句,以便即使发生异常也会处理它们。

答案 1 :(得分:0)

感谢您的帮助,但我找到了答案。显然我只需要像这样引用选项卡的索引:

Private Sub CreateTabs()
    Dim SQLconnect As New SQLite.SQLiteConnection()
    Dim SQLcommand As SQLiteCommand
    SQLconnect.ConnectionString = "Data Source=" & sPath & "\dock.db;"
    SQLconnect.Open()
    SQLcommand = SQLconnect.CreateCommand
    SQLcommand.CommandText = "SELECT title FROM tabs"
    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader()
    Dim Tabs(25) As String
    Dim c As Integer = 1
    While SQLreader.Read()
        Tabs(c) = SQLreader(0)
        c = c + 1
    End While
    SQLcommand.Dispose()
    SQLconnect.Close()
    For i = 1 To UBound(Tabs)
        If Tabs(i) <> "" Then
            Launcher.TabPages.Add(Tabs(i))
            CreateButtons(Tabs(i), i - 1)
        End If
    Next
End Sub

Private Sub CreateButtons(ByVal tab, ByVal TabIndex)
    Dim SQLconnect As New SQLite.SQLiteConnection()
    Dim SQLcommand As SQLiteCommand
    SQLconnect.ConnectionString = "Data Source=" & sPath & "\dock.db;"
    SQLconnect.Open()
    SQLcommand = SQLconnect.CreateCommand
    SQLcommand.CommandText = "SELECT id,name,path FROM buttons WHERE tab = '" & tab & "'"
    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader()
    While SQLreader.Read()
        For i = 1 To 9
            Dim NewButton As New Button
            Launcher.TabPages.Item(TabIndex).Controls.add(NewButton)
            NewButton.Width = 32
            NewButton.Height = 32
            NewButton.Location = New Point(10 + (SQLreader(0) * 32) + 10, 10)
            NewButton.Text = SQLreader(0)
            If Not SQLreader(2) Is System.DBNull.Value Then
                Dim toolTip1 As ToolTip = New System.Windows.Forms.ToolTip(Me.components)
                Dim myIcon As System.Drawing.Icon = Icon.ExtractAssociatedIcon(SQLreader(2))
                NewButton.Image = myIcon.ToBitmap
                toolTip1.SetToolTip(NewButton, SQLreader(1))
                toolTip1.Active = True
            End If
        Next
    End While
    SQLcommand.Dispose()
    SQLconnect.Close()
End Sub
相关问题