2009-08-09 1 views
0

Не уверен, что именно мне нужно сделать, чтобы сделать эту работу, поэтому мне может быть недостает сначала. По сути, я пишу программу запуска, которая каждый раз воссоздает себя при загрузке. Он извлекает данные о вкладках и кнопках из базы данных SQLite и динамически строит себя во время выполнения. Я получаю свою проблему, когда передаю имя вкладки через функцию, которая создает кнопки. Мне нужно имя, чтобы вытащить правильный набор кнопок из базы данных, и затем я попытался использовать это имя, чтобы поместить кнопки на правой вкладке, когда я их создаю, но отладчик называет это пустой ссылкой, потому что он не указывает правильно на вкладке, на которую я пытаюсь это указать (по крайней мере, это то, что я предполагаю). Любые идеи о том, как правильно это сделать?vb.net использовать строку как ранее созданный экземпляр объекта

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 

ответ

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 
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 для своей команды и соединения, чтобы они попадали даже в случае возникновения исключения.

+0

он не скомпилировал и до сих пор не изменился. Я все еще получаю ту же ошибку в режиме отладки «Объектная переменная или с заблокированной переменной блока». в отношении той же линии. – MaQleod

+0

Если это не скомпилировано, то как вы могли видеть что-нибудь в отладчике? Вы не можете отлаживать, не запуская его, и вы не можете запустить его, не компилируя его. Что вы проходите как 'tabControl' с моими изменениями? –

+0

Я просто ударил отладку, и он пытается скомпилировать и предоставляет мне ошибку. Теперь я передаю два аргумента, tabcontrol - это имя элемента управления вкладкой, а вкладка - это текст вкладки, чтобы я мог правильно квалифицировать инструкцию SQL, чтобы выбрать нужный набор кнопок. Я получаю сообщение об ошибке: «Object variable или With block variable not set». в строке, которая пытается добавить новую кнопку на вкладку, tabControl.tabpages (вкладка) .add (NewButton) – MaQleod

Смежные вопросы