none
Oggetto personalizzato inserito a run.time RRS feed

  • Domanda

  • Ciao a tutti, quello che sto per chiedere non è facile ne da spiegare ne da realizzare, però ci voglio provare, siate clementi :-)

    Dunque, ho un oggetto che il cliente mi ha ordinato.
    Tale oggetto essendo grande viene prodotto in un numero di lotti variabile.
    Immaginate di chiamare la fiat e chiedere: mi servono 130000 Fiat Punto.
    Marchionne risponderà: va bene, però te le mando in 13 "botte" da 10000 machine ciascuna.
    Ovviamente questi lotti avranno delle caratteristiche differenti ma gli stessi "campi" da rispettare:

    -data consegna
    -trasporto da
    -trasporto a
    -persona di riferimento e cosi via.

    Traduciamo in codice quello che mi serve.

    Ho una Windows Form vuota.
    All'interno della windows form c'è un TabContainer.

    Se la commessa è composta da 10 lotti il TabContainer deve contenere 10 pagine, se i lotti sono 3, 3 pagine; and so on..
    Il tab panel è formato da 10 label e 10 textbox i quali sono riempiti dal db in lettura.

    Quindi devo dinamicamente aggiungere tante tabpage quanti sono i lotti della commessa.
    La tabpage che viene inserita dinamicamente nel tabController deve ovviamente avere i controlli già inseriti all'interno.
    I controlli devono avere un ID recuperabile in modo tale da poter essere popolati dai dati..

    Mi sono riuscito a spiegare?
    Se si, come posso fare?
    mercoledì 3 febbraio 2010 08:41

Risposte

  • Ciao VMarch.
    Per inserire un nuova nuova TabPage all'interno di un TabControl dovresti creare un nuovo oggetto di classe TabPage, riempirlo creando tutti i controlli necessari e aggiungerlo alla collezione TabPages dell'oggetto TabControl.
    La cosa è assolutamente fattibile ma se i controlli presenti nella tabpage sono tanti rischi di scfrivere tanto codice.
    Hai pensato ad utilizzare una DataGridView in cui visualizzi i dati essenziali dei lotti e, quando l'utente seleziona uno di questi visualizzare all'interno di un pannello i dati completi (le dieci label con i dieci campi)?
    Altra solutione è prevedere un numero di tabpages congruo (che ne so 20) in fase di design e rimuovere quelli che non ti servono (ricordati che non hai il Visible nella TabPage ma devi rimuoverla fisicamente dalla collezione delle pagine del TabControl). A me, però, personalmente non piace molto.

      Saluti
    • Contrassegnato come risposta VMarch mercoledì 3 febbraio 2010 11:04
    mercoledì 3 febbraio 2010 09:15
    Moderatore
  • creati una procedura che aggiunge una TabPage al TabContainer, con tutti i controlli che ti servono. Essi avranno lo stesso nome al loro interno, così potrai sempre riferirti al TabContainer.TabPage.Label1 o (al massimo) al TabContainer.TabPage.Controls("Label1")
    nel .Tag dei controlli, puoi metter l'ID del record

    solo che non dovresti chiamarlo TabContainer, se usi windows form (è un controllo Ajax), ma TabControl

    Come fai? 'disegna' una pagina, va a vedere nel file nomeform.designer.vb e copia la parte di impostazione della pagina, compresa l'aggiunta dei controlli. La metti in una procedura in cui istanzi un controllo dopo l'altro, e lo aggiungi al suo contenitore (tabpage o tabcontrol.tabpages collection)


    please, mark this as answer if it is THE answer
    ----------------
    Diego Cattaruzza
    Microsoft MVP - Visual Basic: Development
    blog: http://community.visual-basic.it/Diego
    web site: http://www.visual-basic.it
    • Proposto come risposta Overlayer mercoledì 3 febbraio 2010 10:32
    • Contrassegnato come risposta VMarch mercoledì 3 febbraio 2010 11:04
    mercoledì 3 febbraio 2010 09:31
  • E' più o meno la soluzione che ti ha proposto Diego.
    Solo che anzichè creati un metodo che crea gli oggetti lasci l'incombenza ad uno user control.
    • Contrassegnato come risposta VMarch mercoledì 3 febbraio 2010 11:03
    mercoledì 3 febbraio 2010 10:24
    Moderatore

Tutte le risposte

  • Ciao VMarch.
    Per inserire un nuova nuova TabPage all'interno di un TabControl dovresti creare un nuovo oggetto di classe TabPage, riempirlo creando tutti i controlli necessari e aggiungerlo alla collezione TabPages dell'oggetto TabControl.
    La cosa è assolutamente fattibile ma se i controlli presenti nella tabpage sono tanti rischi di scfrivere tanto codice.
    Hai pensato ad utilizzare una DataGridView in cui visualizzi i dati essenziali dei lotti e, quando l'utente seleziona uno di questi visualizzare all'interno di un pannello i dati completi (le dieci label con i dieci campi)?
    Altra solutione è prevedere un numero di tabpages congruo (che ne so 20) in fase di design e rimuovere quelli che non ti servono (ricordati che non hai il Visible nella TabPage ma devi rimuoverla fisicamente dalla collezione delle pagine del TabControl). A me, però, personalmente non piace molto.

      Saluti
    • Contrassegnato come risposta VMarch mercoledì 3 febbraio 2010 11:04
    mercoledì 3 febbraio 2010 09:15
    Moderatore
  • creati una procedura che aggiunge una TabPage al TabContainer, con tutti i controlli che ti servono. Essi avranno lo stesso nome al loro interno, così potrai sempre riferirti al TabContainer.TabPage.Label1 o (al massimo) al TabContainer.TabPage.Controls("Label1")
    nel .Tag dei controlli, puoi metter l'ID del record

    solo che non dovresti chiamarlo TabContainer, se usi windows form (è un controllo Ajax), ma TabControl

    Come fai? 'disegna' una pagina, va a vedere nel file nomeform.designer.vb e copia la parte di impostazione della pagina, compresa l'aggiunta dei controlli. La metti in una procedura in cui istanzi un controllo dopo l'altro, e lo aggiungi al suo contenitore (tabpage o tabcontrol.tabpages collection)


    please, mark this as answer if it is THE answer
    ----------------
    Diego Cattaruzza
    Microsoft MVP - Visual Basic: Development
    blog: http://community.visual-basic.it/Diego
    web site: http://www.visual-basic.it
    • Proposto come risposta Overlayer mercoledì 3 febbraio 2010 10:32
    • Contrassegnato come risposta VMarch mercoledì 3 febbraio 2010 11:04
    mercoledì 3 febbraio 2010 09:31
  • Ciao ragazzi,
    mentre aspettavo le vostre gentili risposte ho preso una strada personale. Prima di buttarla vorrei sapere cosa ne pensate.

    Ho creato un Windows Form Controll Library.
    L'ho aggiunto alla mia soluzione e l'ho referenziato.

    Tale controllo è un panel con dentro 10 label e 10 txtbox

    lo aggiungo al TabControl mediante questo codice: 

     

    Dim nLotti As Integer = RelazioniDB.GetNumeroLotti(lbxRisultatoCom.SelectedItem)
            If nLotti > 0 Then
                For i = 1 To nLotti
                    Dim tpa As New TabPage
                    With tpa
                        .Name = "TPL" & i
                        .Text = "LOTTO " & i
                        .BackColor = Me.BackColor
                        .Controls.Add(New MyPanel.UserControl1)
                    End With
    TABLotti.TabPages.Add(tpa)
    For Each xc As Control In TABLotti.TabPages.Item(i - 1).Controls(0).Controls If xc.Name = "TextBox1" Then xc.Text = lbxRisultatoCom.SelectedItem & " " & i End If Next
    Next End If


    E funziona tutto.... Dite di tenerlo o di fare staticamente come dite voi? Mi sembra un codice abbastanza sintetico e semplice.. voi che ne pensate?

    • Proposto come risposta Overlayer mercoledì 3 febbraio 2010 10:33
    mercoledì 3 febbraio 2010 09:45
  • E' più o meno la soluzione che ti ha proposto Diego.
    Solo che anzichè creati un metodo che crea gli oggetti lasci l'incombenza ad uno user control.
    • Contrassegnato come risposta VMarch mercoledì 3 febbraio 2010 11:03
    mercoledì 3 febbraio 2010 10:24
    Moderatore
  • E' vero, solo un po più integrata diciamo..
    Mi pareva una buona idea, tra l'altro ho imparato a creare oggetti personalizzati che non è malaccio in fondo.

    La grid purtroppo non la potevo usare per motivi di spazio... i dati da mostrare sono circa 30 campi e non mi ci stavano :-)

    Grazie siete i miei eroi!

    Sto imparando come un pazzo su questo forum, leggendo i consigli che date agli altri, mi viene voglia di sperimentare ogni momento qualcosa :-)

    Per fortuna che devo finire sto progetto senno impazzirei dietro a mille solution (ovviamente non ne finirei una) hehe.

    mercoledì 3 febbraio 2010 11:03
  • In realtà nella griglia non avresti riportato tutti i campi, ma solo quelli più importanti. Tutti i campi li visualizzi, in dettaglio, quando l'utente seleziona una riga.
    Per quanto riguarda gli eroi.......fortunatamente sono altri i veri eroi :-)
    mercoledì 3 febbraio 2010 11:26
    Moderatore