Aggiornare Datagridview da Form secondario

di il
6 risposte

Aggiornare Datagridview da Form secondario

Salve a tutti, come da titolo sto cercando di fare questa cosa, ovvero:
Ho una Form con un DGV che popolo con il load etc... i dati sono in un database access e fino a qui tutto ok, adesso vorrei, aprendo una seconda Form, inserire i dati nel DGV e far si che questi si aggiornino immediatamente.
Pensavo fosse più semplice collegare il DGV tra 2 form ma vedo che non ce la faccio proprio.
Ho letto Googlando che dovrei:
1 Rileggere i dati
2 Fare un refresh con i dati letti
però non ci riesco, quindi mi domandavo, non potrei scaturire l'evento load del form1? oppure, non esiste un load solo del dgv da avviare?
se fosse tutto nella stessa form basterebbe aggiungere Me.DBGATableAdapter.Fill(Me.DbgaDataSet.DBGA) e via... dove DBGA ovviamente è il mio database access.
come posso muovermi?

Grazie in anticipo

6 Risposte

  • Re: Aggiornare Datagridview da Form secondario

    Salve,
    trivialmente dovresti passare la medesima "datasource" alla dgv del form 2, quindi la medesima datatable o dataview... in questo modo le modifiche sono propagate avanti e indietro...
    brutalmente, 2 form con 1 datagridview ognuna
    form1:
    Friend Class Form1
    
        Private m_dt As DataTable = Nothing
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            m_dt = New DataTable("tb1")
            For iCol As Integer = 0 To 4
                Dim col As DataColumn = New DataColumn With {.ColumnName = String.Format("col{0}", iCol.ToString), .DataType = System.Type.GetType("System.String"), .DefaultValue = "", .MaxLength = 10}
                If iCol = 0 Then
                    m_dt.Columns.Add(New DataColumn With {.AutoIncrement = True, .AutoIncrementSeed = 1, .AutoIncrementStep = 1, .DataType = System.Type.GetType("System.Int32"), .Unique = True})
                End If
                m_dt.Columns.Add(col)
                col = Nothing
            Next
    
            For iRow As Integer = 1 To 10
                Dim dr As DataRow = m_dt.NewRow
                For iCol As Integer = 1 To 5
                    dr(iCol) = String.Format("{0}:{1}-{2}", iRow.ToString, iCol.ToString, New String(Chr(iCol + 64), iCol))
                Next
                m_dt.Rows.Add(dr)
                dr = Nothing
            Next
    
            With DataGridView1
                .SuspendLayout()
                .DataSource = Nothing
    
                .Columns.Clear()
                .AutoGenerateColumns = True
    
                .DataSource = Me.m_dt.DefaultView
                .MultiSelect = False
                .AllowUserToAddRows = True
                .AllowUserToDeleteRows = True
                .ResumeLayout()
    
                .Columns(0).ReadOnly = True
            End With
    
        End Sub
    
        Private Sub DataGridView1_CellMouseDoubleClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDoubleClick
    
            If Not Me.DataGridView1.DataSource Is Nothing AndAlso e.RowIndex >= 0 AndAlso e.ColumnIndex = 0 Then
    
                For Each frm As Form In My.Application.OpenForms
                    'If frm Is Form2 Then Return ' 1 solo dialogo accessorio
                Next
                Dim frmDlg As New Form2
                With frmDlg
                    .refDtView = Me.DataGridView1.DataSource
                    .Show(Me)
                End With
            End If
            
        End Sub
    
    End Class
    form2
    
    Friend Class Form2
    
        Friend Property refDtView As DataView = Nothing
    
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            With DataGridView1
                .SuspendLayout()
                .DataSource = Nothing
    
                .Columns.Clear()
                .AutoGenerateColumns = True
    
                .DataSource = Me.refDtView
                .MultiSelect = False
                .AllowUserToAddRows = True
                .AllowUserToDeleteRows = True
                .ResumeLayout()
    
                .Columns(0).ReadOnly = True
            End With
            
        End Sub
    
    End Class
    con dblclick sul contenuto di una riga in colonna1 si apre form2...
    modificando le righe, le modifiche vengono propagate avanti e indietro
    questo anche se ci sono diversi form2 aperti (ho remmato 'If frm Is Form2 Then Return ' 1 solo dialogo accessorio in modo da poterne averne diversi) ...

    salutoni omnia
    --
    Andrea
  • Re: Aggiornare Datagridview da Form secondario

    Ciao, grazie per la risposta, ma se non ho capito male il tuo consiglio è quello di avere 2 dgv no? La cosa non è che mi faccia impazzire, io i dati del Form2 li scrivo del database correttamente, solo il dgv nel form 1 si aggiorna solo al riavvio del programma ( perchè il codice è nel load del form1).
    Possibile non ci sia moto per aggiornare i dati del dgv? cioè nel BTN di chiusura non posso far si che si ripopoli il dgv? Ho capito quanto mi stai dicendo però boh, sarà che non sono ferratissimo ma vedo progetti che funzionano con 1 solo dgv quindi un qualche modo dovrà esserci.
    Non posso far partire il comando nel load che all'avvio carica il DGV? Tipo Form1.Datagridview1.Refresh solo che dovrei specificare "ricarica" il database.

    Scusa se mi esprimo male, sto solo cercando di capire queste logiche.

    Marco
  • Re: Aggiornare Datagridview da Form secondario

    Salve Marco,
    per complicare le cose io ho usato 2 dgv, ma cio' non toglie che si possa usarne 1 sola nella form primaria e, ad esempio, delle textbox in form2...
    l'importante e' che la form2 utilizzi lo stesso datasource della dgv in form1... se questo non avviene, il datasource primario NON puo' essere a conoscenza delle modifiche/cambiamenti... ed in questo caso, oltre a non avere le modifiche immediate (come puoi vedere eseguendo il codice) propagate tra il datasource nelle 2 form, non avrai alcuna "modifica" visibile... dovrai giocoforza eseguire un refresh dal db sottostante... che questo venga fatto in form1 o form2 e' irrilevante, basta che a form1.dgv.datasource arrivi una fonte aggiornata...
    salutoni omnia
    --
    Andrea
  • Re: Aggiornare Datagridview da Form secondario

    Ciao, si certo, ho un solo Db e ovviamente quello che scrivo nel form2 ovviamente lo fa in modo corretto ed essendo lo stesso e l'unico questo lo ricarica bene al riavvio... per capirci, nel Load del form1 ho messo Me.DBTableAdapter.Fill(Me.DBGMDataSet.DB) quindi carica il file DBGM e va a leggere i dati della tabella DB ed è corretto infatti.
    Nel form 2 scrivo sempre li, quindi è esatto... possibile non posso in qualche modo far ripartire questo Me.DBTableAdapter.Fill(Me.DBGMDataSet.DB) come se dovessi ricaricare il Load?

    Per dare piu info, nel form2 tramite textbox aggiungo i valori al dgv e il dgv nel form1 ha i controlli bloccati in scrittura, modifica etc..
  • Re: Aggiornare Datagridview da Form secondario

    Salve Marco,
    provo a ripetermi....
    se NON usi lo stesso data context, gli aggiornamenti NON saranno propagati direttamente, e quindi nella form1 dovrai ripetere il metodo di ripopolamento dei controlli... potresti ad esempio in questo caso aggiungere un riferimento in form2 alla form1, ed al momento del salvataggio di form2 fare un callback sul riferimento di form1 indicandogli di ripopolare i dati...
    se usi le stesso data context, gli aggiornamenti saranno immediatamente visibili...
    saluti omnia
    --
    Andrea
  • Re: Aggiornare Datagridview da Form secondario

    Ciao, siccome ho compreso solo in parte ciò che mi indicavi e questo è dovuto a me non alle tue spiegazioni, ho risolto in questo modo.

    premesso come dicevamo prima che, i dati sono nella stessa tabella e nello stesso db dove scrivo nel Form2
    Ho un pulsante aggiorna nel Form1 che ovviamente con Me.DBTableAdapter.Fill(Me.DBGMDataSet.DB) aggiorna il Datagridview
    ed ho inserito nel Bottone Aggiungi del form2, in fondo al codice, quando questo è ultimato, il comando che attiva il bottone aggiorna del form1
    Form1.btnAggiorna.PerformClick()

    e funziona...

    ovviamente non è la soluzione migliore ma è la piu rapida e visto che il bottone aggiorna è mia intenzione lasciarlo... ho risolto così....

    P.S. mi impegnerò nella tua soluzione però...

    Marco
Devi accedere o registrarti per scrivere nel forum
6 risposte