Oggi ho trovato un po' di tempo ti ho preparato questo codice.
Io ho usato un database Access, quindi devi adattarlo un po' al tuo db.
Nel Form c'è solo un
TabControl1 ed un button
cmdPopola.
Il database contiene due tabelle: Reparti e Oggetti, strutturate in modo corretto (come da te richiesto).
E questo è il risultato del codice sottostante:
Imports System.Data.OleDb
Public Class frmTab
Private Sub cmdPopola_Click(sender As Object, e As EventArgs) Handles cmdPopola.Click
Dim sql As String
sql = "SELECT Reparti.IDReparto, Reparti.Descrizione, Oggetti.IDOggetto, Oggetti.Descrizione"
sql = sql & " FROM Oggetti INNER JOIN Reparti ON Oggetti.IDReparto = Reparti.IDReparto"
sql = sql & " ORDER BY Reparti.Descrizione, Oggetti.Descrizione"
Dim sReparto As String
Dim sPulsante As String
Dim tPage As TabPage
Dim cControllo As Control
TabControl1.TabPages.Clear()
'
'NB: sostituisci Program.OleDbConnectionString con la TUA stringa di connessione
'
Using connJET As OleDbConnection = New OleDbConnection(Program.OleDbConnectionString)
Try
' open connection
connJET.Open()
Dim aCommand As OleDbCommand = New OleDbCommand(sql, connJET)
Using aReader As OleDbDataReader = aCommand.ExecuteReader
If aReader.HasRows Then
While aReader.Read()
tPage = Nothing
cControllo = Nothing
sReparto = aReader.GetValue(1).ToString
sPulsante = aReader.GetValue(3).ToString
For Each t As TabPage In TabControl1.TabPages
If t.Text = sReparto Then
tPage = t
Exit For
End If
Next
If tPage Is Nothing Then
tPage = New TabPage()
tPage.Text = sReparto
TabControl1.TabPages.Add(tPage)
End If
For Each c As Control In tPage.Controls
If c.Text = sPulsante Then
cControllo = c
End If
Next
If cControllo Is Nothing Then
Dim b As New Button
b.Text = sPulsante
tPage.Controls.Add(b)
b.Location = New Point(tPage.Controls.Count * b.Width - b.Width + 12, 12)
End If
End While
End If
End Using
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Using
End Sub
End Class