Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net将字符串用作以前创建的对象实例_Vb.net - Fatal编程技术网

vb.net将字符串用作以前创建的对象实例

vb.net将字符串用作以前创建的对象实例,vb.net,Vb.net,我不确定我需要做什么来完成这项工作,所以一开始可能缺少我的描述。实际上,我正在编写一个程序启动器,每次加载时都会重新创建自己。它从SQLite数据库中提取有关选项卡和按钮的数据,并在运行时动态构建自身。当我将选项卡名称传递给创建按钮的函数时,我遇到了问题。我需要名称来从数据库中提取正确的按钮集,然后在创建按钮时尝试使用名称将按钮放置在正确的选项卡上,但调试器将其称为空引用,因为它没有正确指向我试图使其指向的选项卡页至少我猜是这样。关于如何使这项工作正常进行,有什么想法吗 Private Sub

我不确定我需要做什么来完成这项工作,所以一开始可能缺少我的描述。实际上,我正在编写一个程序启动器,每次加载时都会重新创建自己。它从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

我想你有两个问题:

您正在尝试按选项卡名称查找选项卡控件。相反,您应该查找选项卡控件本身,或者将其传入并在该控件中查找选项卡的名称。否则,您将尝试将按钮添加到选项卡页面集合中,而不是添加到特定选项卡中

你永远不会真正创建一个新按钮。您正在为循环的每个迭代创建一个按钮数组,但不是一个新的实际按钮对象。诚然,这与你的怀疑不符,这是由于标签页,但这肯定是一个问题

我怀疑您希望将其作为循环,其中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不是很好

我很惊讶你编译的原始代码-你有严格的选项吗


您还应该在命令和连接中使用Using语句,这样即使出现异常,它们也会得到处理。

谢谢您的帮助,但我找到了答案。显然,我只需要引用选项卡的索引,如下所示:

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

它没有编译,而且仍然没有修改。在调试模式对象变量或未设置块变量时,仍然会出现相同的错误。引用同一行。如果它没有编译,那么你怎么能在调试器中看到任何东西?不运行它就无法调试,不编译它也无法运行它。在我的更改中,您作为tabControl传递了什么?我刚刚点击开始调试,它尝试编译并向我提供了错误。我现在传递两个参数,tabcontrol是tab控件名,tab是tabpage文本,这样我就可以正确地限定SQL语句以选择正确的按钮集。我得到错误:对象变量或块变量未设置。在尝试将新按钮添加到选项卡的行中,tabControl.tabpagestab.addNewButtonMaybe对于我所需要的内容更具意义。这基本上就是我想要做的:tab.Controls.addNewButton,除了我传递tab的方式是一个字符串,而不是对tabpage对象实例的引用,每次传递tabpage时,该对象实例都以该特定字符串命名。我不知道如何引用该对象实例并将其传递到函数中。如果为tabControl传递正确的控件(不是名称,而是包含tab页的实际控件),应该可以。