+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [vbnet 2010] Problema visualizzazione dati su dgv

  1. #1
    ljt
    ljt non è in linea Scolaretto
    Post
    126

    [vbnet 2010] Problema visualizzazione dati su dgv

    Salve a tutti,

    ho la seguente questione da risolvere.
    Ho una form_1 che contiene un button_1 alla pressione del quale apre a sua volta una form_2 che contiene una dgv_2.
    Nella form_2 a sua volta c'è un button_2 che apre una form_riepilogo con una dgv_riepilogo che contiene il riepilogo dei valori selezionati nella form_2.dgv_2.
    Il programma che ho fatto funziona senza alcun problema.
    Dunque ho la seguente struttura:
    codice:
    Form_1 contiene  button_1 che apre:
             Form_2 contiene  dgv_2 con button_2 che apre:
                     Form_riepilogo che contiene dgv_riepilogo con i dati selezionati nella form_2.dgv_2
    Dato che la form_riepilogo contenente la dgv_riepilogo è una form che vorrei poterla riutilizzare n volte senza replicarla ho modificato il programma nel seguente modo:
    codice:
    Form_1 contiene button_1 che apre e passa il valore 1:
                                            Form_2 che contiene  dgv_2 con button_2 che apre:
                                                     Form_riepilogo che contiene dgv_riepilogo con i dati selezionati nella form_2.dgv_2
                contiene button_2 che apre e passa il valore 2:
                                           Form_10 che contiene dgv_10 con button_10 che apre:
                                                     Form_riepilogo che contiene dgv_riepilogo con i dati selezionati nella form_10.dgv10
    etc etc.....
    Ma ho un problema:
    Quando apro la form_riepilogo non mi visualizza più i dati passati dalla form_2.dgv_2
    Ma non riesco a capire.
    Di seguito gli spezzoni di codice che ho scritto e funzionanti tranne per il problema sopra descritto:
    codice:
    Form_1
      Private Sub btn2_Click(sender As System.Object, e As System.EventArgs) Handles btn2.Click
            Dim frm2 As New frm_2
    
            frm2.Valore = 2
            frm2.Show()
    
        End Sub
    end
    
    Private Sub btn3_Click(sender As System.Object, e As System.EventArgs) Handles btn2.Click
            Dim frm3 As New frm_3
    
            frm3.Valore = 3
            frm3.Show()
    
    etc...
        End Sub
    Nella frm2:
    codice:
    Public Class frm_2
     Dim mValore As Integer = 0
    
        Public Property Valore As Integer
            Get
                Return mValore
            End Get
            Set(ByVal value As Integer)
                mValore = value
            End Set
        End Property
     Private Sub frm_2_Load
       .....
       .....
       'Viene chiamata la frmRiepilogo                     
       frmRiepilogo.ShowDialog()
       frmRiepilogo.Dispose()
     
     end sub
    end class
    Nella frmRiepilogo:
    codice:
    Public Class frmRiepilogo
                 If frm_2.dgv2.Rows.Count > 0 Then
                For Each row In frm_form_2.dgv2.Rows
                    If row.cells("cSel").value = True Then
                        dgvRiepilogo.Rows.Add(row.cells("valore1").value,  row.cells("valore2").value)
                    End If
                Next
            End If
    .........
    ........
    end class
    Ho dovuto aggiungere anche un passaggio di un valore dalle form per varie esigenze.

    Grazie a tutti

  2. #2
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    278
    C'è qualcosa che mi sfugge... Da quel che intendo, tu vorresti che la [frm_riepilogo] sia riutilizzabile ovunque nel progetto, ma la classe che lo descrive non ha senso. Lo stralcio che hai citato è necessariamente:
    1) incompleto. Una classe non può iniziare con un blocco [If];
    2) errato. la variabile [frm2] utilizzata nel blocco [If] è invisibile alla classe, dato che è una variabile locale a livello della Sub [btn2_Click].

    Visto che nel codice della Form1 ad un certo punto crei un oggetto di tipo [frm3], il codice di quest'altra form come è strutturato? Ti aspetti che anche questa possa utilizzare il riepilogo?

    Se è questo che ti serve, io lavorerei impostando la struttura così:
    codice:
    Form_1 contiene
            button_n che apre e passa il valore n:
                                            Form_2 che contiene dgv_2 con button_riepilogo che apre:
                                                     Form_riepilogo che contiene dgv_riepilogo con i dati selezionati nella form_2.dgv_2

  3. #3
    ljt
    ljt non è in linea Scolaretto
    Post
    126
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    C'è qualcosa che mi sfugge... Da quel che intendo, tu vorresti che la [frm_riepilogo] sia riutilizzabile ovunque nel progetto, ma la classe che lo descrive non ha senso. Lo stralcio che hai citato è necessariamente:
    1) incompleto. Una classe non può iniziare con un blocco [If];
    2) errato. la variabile [frm2] utilizzata nel blocco [If] è invisibile alla classe, dato che è una variabile locale a livello della Sub [btn2_Click].

    Visto che nel codice della Form1 ad un certo punto crei un oggetto di tipo [frm3], il codice di quest'altra form come è strutturato? Ti aspetti che anche questa possa utilizzare il riepilogo?

    Se è questo che ti serve, io lavorerei impostando la struttura così:
    codice:
    Form_1 contiene
            button_n che apre e passa il valore n:
                                            Form_2 che contiene dgv_2 con button_riepilogo che apre:
                                                     Form_riepilogo che contiene dgv_riepilogo con i dati selezionati nella form_2.dgv_2
    Ciao Sgrubak
    intanto grazie per la risposta.
    Rispondendo alla tua prima domanda:
    Si il codice non è completo ho solo riportato il codice che ritenevo essenziale. Prima e dopo il blocco IF ci sono altre istruzioni.
    Visto che nel codice della Form1 ad un certo punto crei un oggetto di tipo [frm3], il codice di quest'altra form come è strutturato? Ti aspetti che anche questa possa utilizzare il riepilogo?
    La frm3 è strutturata come la frm2, sono molto simili, tutte e due contengono una dgv praticamente uguale e mi aspetto che la frm3 possa utilizzare la frm_riepilogo.
    In pratica vorrei che la form_riepilogo venga utilizzata come form "globale" cioè utilizzabile per essere aperta da altre form.
    Per finire:
    Se è questo che ti serve, io lavorerei impostando la struttura così:
    codice:
    Form_1 contiene
            button_n che apre e passa il valore n:
                                            Form_2 che contiene dgv_2 con button_riepilogo che apre:
                                                     Form_riepilogo che contiene dgv_riepilogo con i dati selezionati nella form_2.dgv_2
    In effetti questo è quello che vorrei fare ma, purtroppo, quando apro la frm_riepilogo dalla form_2 non visualizzo i dati della dgv_2 nella dgv_riepilogo contenuta nella frm_riepilogo.
    Forse così è più chiaro:
    codice:
    Form1
           Contiene Button1 --> Apre Frm2 
                                           Contiene Button2 --> Apre frm_riepilogo riprendendo i dati selezionati dalla dgv 
                                                                                 contenuta nella Frm2
    Grazie di nuovo

  4. #4
    L'avatar di Eleatico
    Eleatico non è in linea Scolaretto
    Luogo
    Eboli
    Post
    51
    Quote Originariamente inviato da ljt Visualizza il messaggio
    Salve a tutti,

    ho la seguente questione da risolvere.
    Ho una form_1 che contiene un button_1 alla pressione del quale apre a sua volta una form_2 che contiene una dgv_2.
    Nella form_2 a sua volta c'è un button_2 che apre una form_riepilogo con una dgv_riepilogo che contiene il riepilogo dei valori selezionati nella form_2.dgv_2
    ................
    Form_10 che contiene dgv_10 con button_10 che apre:
    Form_riepilogo che contiene dgv_riepilogo con i dati selezionati nella form_10.dgv10
    etc etc.....
    [/code]

    Grazie a tutti
    Scusa ma non è più semplice avere una sola form con 10,20,30 bottoni in cui c'è un solo dgv riempito diversamente al clickare dei vari bottoni indi selezioni le righe che ti servono e con un altro bottone apri, eventualmente, altra form (di riepilogo) in cui inserisci un dgv con le righe selezionate?

  5. #5
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    278
    Quote Originariamente inviato da ljt Visualizza il messaggio
    La frm3 è strutturata come la frm2, sono molto simili, tutte e due contengono una dgv praticamente uguale e mi aspetto che la frm3 possa utilizzare la frm_riepilogo.
    Sta tutto qui e in come imposti il codice. Stai utilizzando un linguaggio nato per la OOP, perché non sfruttarla?
    Io creerei una Classe che descriva l'utilizzo del riepilogo e la chiamerei [FormRiepilogo], poi deriverei [frm1] e [frm2] da [FormRiepilogo].
    Semplice, veloce e facilmente manutenibile.

  6. #6
    ljt
    ljt non è in linea Scolaretto
    Post
    126
    Quote Originariamente inviato da Eleatico Visualizza il messaggio
    Scusa ma non è più semplice avere una sola form con 10,20,30 bottoni in cui c'è un solo dgv riempito diversamente al clickare dei vari bottoni indi selezioni le righe che ti servono e con un altro bottone apri, eventualmente, altra form (di riepilogo) in cui inserisci un dgv con le righe selezionate?
    Grazie per la risposta.

    Il programma fa all'incirca quello che dici tu, ma il problema è che non mi passa i dati dalla prima dgv da dove seleziono i valori, alla seconda dgv come vorrei.

    Grazie

  7. #7
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    278
    Quote Originariamente inviato da ljt Visualizza il messaggio
    il problema è che non mi passa i dati dalla prima dgv da dove seleziono i valori, alla seconda dgv come vorrei.
    Non te li passa perché questo codice non può funzionare:
    codice:
    Public Class frmRiepilogo
                 If frm_2.dgv2.Rows.Count > 0 Then
                For Each row In frm_form_2.dgv2.Rows
                    If row.cells("cSel").valueen
                        dgvRiepilogo.Rows.Add(row.cells("valore1").valuerow.celrow.cells("valore2").value        End If
                Next
            End If
    .........
    ........
    end class
    [frm_2] è visibile solo dalla prima Form (più precisamente solo dalla Sub in cui viene creata). Se vai in debug, dovresti vedere [frm_2] settata a Nothing, a meno che tu non abbia dichiarato esplicitamente la variabile o Public o Friend a livello di Form_1.

  8. #8
    ljt
    ljt non è in linea Scolaretto
    Post
    126
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Sta tutto qui e in come imposti il codice. Stai utilizzando un linguaggio nato per la OOP, perché non sfruttarla?
    Io creerei una Classe che descriva l'utilizzo del riepilogo e la chiamerei [FormRiepilogo], poi deriverei [frm1] e [frm2] da [FormRiepilogo].
    Semplice, veloce e facilmente manutenibile.
    Sto cercando di seguire il tuo consiglio, passando il nome della form.
    Al momento ho provato in questo modo:
    Nella Form_2 ho creato:
    codice:
    ...
    Dim frm2 As New frmRiepilogo
    ...
    frm2.FormChiamante = "frm_2"
    frm2.ShowDialog()
    frm2.Dispose()
    Nella frmRiepilogo ho inserito
    codice:
    ...
    Dim mFormChiamante As String
    ...
       Public Property FormChiamante As String
            Get
                Return mFormChiamante
            End Get
            Set(ByVal value As String)
                mFormChiamante = value
            End Set
        End Property
    ....
              If FormChiamante.dgvRiepilogo.rows.count > 0 Then
    
              End If
    Ma ovvio che l'istruzione:
    codice:
    If FormChiamante.dgvRiepilogo.rows.count > 0 Then
    
              End If
    da errore. drgriepilogo non è un membro di string.
    Ho provato a definire la FormChiamante come Form:
    codice:
        Dim mFormChiamante As Form
    
        Public Property FormChiamante As Form
            Get
                Return mFormChiamante
            End Get
            Set(ByVal value As Form)
                mFormChiamante = value
            End Set
        End Property
    ...
               If FormChiamante.dgvRiepilogo.rows.count > 0 Then
    
                End If
    Ma dgvRiepilogo non è un membro di windows.form

    E' una strada percorribile o devo cambiare approccio?

    Grazie ancora

  9. #9
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    278
    Quote Originariamente inviato da ljt Visualizza il messaggio
    E' una strada percorribile o devo cambiare approccio?
    È esattamente quel che ti serve. Devi solo dichiararla di tipo Form_2. Così facendo avrai accesso a tutto ciò che della classe è dichiarato come Public o Friend, quindi bada che la classe Form_2 esponga la dgv tramite proprietà (magari in sola lettura) o che la dgv nella Form sia dichiarata Public (personalmente te lo sconsiglio, così mantieni l'incapsulamento).

    Poi correggi la chiamata così:
    codice:
    Dim frm2 As New frmRiepilogo
    ...
    frm2.FormChiamante = Me 'Così facendo passi il riferimento della form dalla quale hai premuto il bottone.
    frm2.ShowDialog()
    frm2.Dispose()
    Per semplificarti la vita, ti suggerivo di ereditare Form_2 e tutte le altre che devono avere il riepiloga Da una Classe madre che chiamerei FormConRiepilogo, così il codice diventerebbe:
    codice:
    Public Class FormConRiepilogo Inherits Form
        'Qui ci metti tutto quel che ti serve su tutte le form che necessitano del riepilogo
    End Class
    
    Public Class Form_n Inherits FormConRiepilogo
        Private Sub btnRiepilogo_Click (Sende as Object, e as EventArgs) Handles btnRiepilogo.Click
            Dim frm As New frmRiepilogo
           ...
            frm.FormChiamante = Me 'Così facendo passi il riferimento della form dalla quale hai premuto il bottone.
            frm.ShowDialog()
            frm.Dispose()
        End Sub
       'Poi descrivi tutte le differenze tra le varie Form che però in comune hanno il riepilogo
    End Class
    
    Public Class frmRiepilogo Inherits Form
        Dim mFormChiamante as FormConRiepilogo
    
        Public Property FormChiamante As FormConRiepilogo
            Get
                Return mFormChiamante
            End Get
            Set(ByVal value As Form)
                mFormChiamante = value
            End Set
        End Property 
    
       'Tutto il resto della descrizione del riepilogo
    End Class
    Così facendo l'assegnazione frm = Me sarà sempre valida per tutte le Form che derivano da FormConRiepilogo indipendentemente che sia la Form_2 la 3 o la enn-millesima.
    Ultima modifica di Sgrubak; 09-04-2019 13:08 

  10. #10
    ljt
    ljt non è in linea Scolaretto
    Post
    126
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    È esattamente quel che ti serve. Devi solo dichiararla di tipo Form_2. Così facendo avrai accesso a tutto ciò che della classe è dichiarato come Public o Friend, quindi bada che la classe Form_2 esponga la dgv tramite proprietà (magari in sola lettura) o che la dgv nella Form sia dichiarata Public (personalmente te lo sconsiglio, così mantieni l'incapsulamento).

    Poi correggi la chiamata così:
    codice:
    Dim frm2 As New frmRiepilogo
    ...
    frm2.FormChiamante = Me 'Così facendo passi il riferimento della form dalla quale hai premuto il bottone.
    frm2.ShowDialog()
    frm2.Dispose()
    Per semplificarti la vita, ti suggerivo di ereditare Form_2 e tutte le altre che devono avere il riepiloga Da una Classe madre che chiamerei FormConRiepilogo, così il codice diventerebbe:
    codice:
    Public Class FormConRiepilogo Inherits Form
        'Qui ci metti tutto quel che ti serve su tutte le form che necessitano del riepilogo
    End Class
    
    Public Class Form_n Inherits FormConRiepilogo
        Private Sub btnRiepilogo_Click (Sende as Object, e as EventArgs) Handles btnRiepilogo.Click
            Dim frm As New frmRiepilogo
           ...
            frm.FormChiamante = Me 'Così facendo passi il riferimento della form dalla quale hai premuto il bottone.
            frm.ShowDialog()
            frm.Dispose()
        End Sub
       'Poi descrivi tutte le differenze tra le varie Form che però in comune hanno il riepilogo
    End Class
    
    Public Class frmRiepilogo Inherits Form
        Dim mFormChiamante as FormConRiepilogo
    
        Public Property FormChiamante As FormConRiepilogo
            Get
                Return mFormChiamante
            End Get
            Set(ByVal value As Form)
                mFormChiamante = value
            End Set
        End Property 
    
       'Tutto il resto della descrizione del riepilogo
    End Class
    Così facendo l'assegnazione frm = Me sarà sempre valida per tutte le Form che derivano da FormConRiepilogo indipendentemente che sia la Form_2 la 3 o la enn-millesima.
    Ok, adesso funziona.
    E' bastato modificare:
    codice:
    Public Property FormChiamante As Form
            Get
                Return mFormChiamante
            End Get
            Set(ByVal value As Form)
                mFormChiamante = value
            End Set
        End Property
    Con il tuo consiglio:
    codice:
    Public Property FormChiamante As FormChiamante
            Get
                Return mFormChiamante
            End Get
            Set(ByVal value As Form)
                mFormChiamante = value
            End Set
        End Property
    E ovviamente anche:
    codice:
    frm.FormChiamante = Me
    L'unica cosa è che il comando
    codice:
    Inherits Form
    non l'ho inserito e comunque funziona ugualmente.

    Comunque, grazie mille per la pazienza e gli utili consigli.

    Ciao e al prossimo quesito.


+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi