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