Riempire tabpage da DB Mysql

di il
29 risposte

29 Risposte - Pagina 2

  • Re: Riempire tabpage da DB Mysql

    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
  • Re: Riempire tabpage da DB Mysql

    Grazie mille Gibra, ho capito molto cose grazie a te, il mio scoglio più grande ieri pomeriggio è stato, come confrontare una tab che non ho ancora creato, ma adesso so come fare, e ho scoperto cose nuove come HasRows , grazie mille ancora di tutto
  • Re: Riempire tabpage da DB Mysql

    Infatti ho capito che eri in seria difficoltà, ed in questi casi è facile entrare in un 'loop' da cui diventa difficile uscirne.
    Per quello ti ho postato il codice completo (cosa che faccio raramente!)

    Nel codice, comunque, manca ancora un controllo da eseguire prima di creare la tab: controllare se questa ha pulsanti/oggetti.
    Intendo dire che potrebbe verificarsi (malauguratamente e/o erroneamente) il caso in cui esiste un reparto ma non esiste alcun pulsante per quel reparto. Se così fosse, verrebbe comunque creato un tab del reparto, ma sarebbe vuoto.
    Lo so, immagino che sia una situazione che non dovrebbe mai verificarsi, ma chi può dirlo?

    Lascio a te questa ulteriore incombenza.



    P.S.
    Ti consiglio di comunicare nell'altro forum che hai risolto, onde evitare che altri utenti perdano tempo inutilmente.
    Puoi sempre mettere un link a questa discussione.
  • Re: Riempire tabpage da DB Mysql

    Si e vero, l'ho notato mentre facevo i test, adesso creo quel controllo , non capisco solo una cosa, come mai il bottone (b) lo devo per forza dichiarare all'interno del while? ho provato a dichiararlo fori dal while ma all'nterno della sub, ma niente, la dichiarazione l'ho inserita anche in un modulo come public, ma niente ancora...
  • Re: Riempire tabpage da DB Mysql

    Scusa, ma non capisco quale sia il problema...
  • Re: Riempire tabpage da DB Mysql

    No scusa gibra, ho sbagliato io
  • Re: Riempire tabpage da DB Mysql

    Ciao gibra, mi spiegheresti solo questo passaggio:
    b.Location = New Point(tPage.Controls.Count * b.Width - b.Width + 12, 12)
    non capisco la valorizzazione di X
  • Re: Riempire tabpage da DB Mysql

    Il passaggio serve ad affiancare i pulsanti, altrimenti sarebbe sovrapposti.
    Vedi l'immagine nel mio post.
    In sostanza gli dico di creare il pulsante a partire da 12 ed affiancare i successivi.

    Riguardo alla valorizzazione di X, spiegati meglio perché non c'è alcuna X...
  • Re: Riempire tabpage da DB Mysql

    Suggerisco di utilizzare una variabile globale FATTORE (o meglio ancora una funzione puntivirtuali o qualcosa del genere) che consenta di applicare una modifica alle coordinate, a seconda della risoluzione dello schermo.

    Questo consente di adattare banalmente a display ad altissima risoluzione (sempre più diffusi) per i quali, altrimenti, i componenti dell'interfaccia sarebbero troppo piccini.

    Con un minimo di attenzione si riesce a "sganciarsi" dai "bruti pixel", cosa assolutamente consigliabile.

    Certo l'ideale sarebbe avere un NexStep e le sue pagine PS, ma bisogna accontentarsi...
  • Re: Riempire tabpage da DB Mysql

    Scusami ho detto valorizzazione di X perché immagino :
    btn.Location = New Point(x,y).

    Per quanto riguarda a cosa serve, avevo intuito che serviva a non far sovrapporre i tasti, ma se io dopo un tot. di tasti, decidessi di creare un altra riga di bottoni a capo, questa cosa non mi viene, per questo sono convinto che non ho capito al 100% come funziona.
    Avevo provato a dirgli:

    btn.Location = New Point(tPage.Controls.Count * btn.Width - btn.Width + 12, 12)
    se ho 5 tasti allora:
    btn.Location = New Point(tPage.Controls.Count * btn.Width - btn.Width + 12, 60)
    cercando di creare un altra riga sotto, ma ovviamente ho sbagliato, perché la prima riga la scrive bene, la seconda me li sovrappone
  • Re: Riempire tabpage da DB Mysql

    Mi corrego, per creare un riga sotto scrivo:
    btn.Location = New Point(btn.Width - btn.Width + 12, 60)
    ma con lo stesso risultato: la seconda me li sovrappone
  • Re: Riempire tabpage da DB Mysql

    Se ho capito bene, tu vorresti che il layout dei pulsanti si adattasse alla dimensione del TabPage.
    Se è così, dovresti prima calcolare la dimensione del TabPage, poi calcolare lo spazio necessario per capire se il pulsante (in funzione della propria altezza e larghezza) ci sta, oppure va posizionato 'a capo'.
    Però dando per ovvio che il TabControl (e relativo TabPage) non venga mai ridimensionato, altrimenti dovresti crearti una routine di resize che riposiziona i pulsanti ad ogni modifica di largehzza ed altezza.

    Secondo me, in questo caso, è preferibile utilizzare un controllo FlowLayoutPanel che, se aggiunto dentro al controllo TabPage, fa tutto da solo.
    Ti basta aggiungere il FlowLayoutPanel ad ogni nuovo TabPage, a cui conviene 'ancorarlo', poi i bottoni li aggiungi al FlowLayoutPanel invece che al TabPage. Et voilà. Il gioco è fatto.

    Con 3 righe di codice te la cavi.
  • Re: Riempire tabpage da DB Mysql

    Grazie mille, la tua soluzione è stata perfetta, grazie ancora
  • Re: Riempire tabpage da DB Mysql

    In un ottica di condivisione, sarebbe corretto che tu postassi la soluzione.
    Altrimenti a che serve un forum?
  • Re: Riempire tabpage da DB Mysql

    Si si, ho finito ora di scrivere la soluzione
    
     
      If tPage Is Nothing Then
                            tPage = New TabPage()
                            fPanel = New FlowLayoutPanel()
                            tPage.Text = sReparto
                            TabControl1.TabPages.Add(tPage)
                            tPage.Controls.Add(fPanel)
                            fPanel.Dock = DockStyle.Fill
                        End If
    
                        For Each c As Control In fPanel.Controls
                            If c.Text = sPulsante Then
                                cControllo = c
                            End If
                        Next
    
                        If cControllo Is Nothing Then
                            btn = New Button
                            btn.Text = sPulsante
                            btn.Height = btn.Height * 2
                            btn.Width = btn.Width * 2
                            fPanel.Controls.Add(btn)
                            btn.Location = New Point(fPanel.Controls.Count * btn.Width - btn.Width + 20, 20)
                            AddHandler btn.Click, AddressOf MyButton_Click
                        End If
           
    
Devi accedere o registrarti per scrivere nel forum
29 risposte