Problema datagridview e refresh

di il
11 risposte

Problema datagridview e refresh

Salve, piccolo problema.
ho una base dati che popola un datagridview direttamente da codice con origine database mysql

carico dati, cancello, ordino e tutto fin qui funziona.

Ma quando cancello un dato dal database non riesco a far riaggiornare la tabella, solo se chiudo il form e lo riapro si aggiorna

come posso fare??
Grazie 1000

11 Risposte

  • Re: Problema datagridview e refresh

    ribelle ha scritto:


    Ma quando cancello un dato dal database non riesco a far riaggiornare la tabella, solo se chiudo il form e lo riapro si aggiorna
    Intendi che lo cancelli esternamente all'applicazione?
  • Re: Problema datagridview e refresh

    No no da codice, USO INSERT, DELETE e lavoro direttamente sul db.
    Il database si aggiorna ma la tabella non ricarica l'aggiornamento se non esco e rientro.
    datagridview1.refresh non aggiorna.
    Sicuramente sbaglio quacosa.
    Non usa dataset o datatable
  • Re: Problema datagridview e refresh

    Posta il codice altrimenti non si capisce nulla.
  • Re: Problema datagridview e refresh

    Esegui nuovamente la SELECT dopo la DELETE
  • Re: Problema datagridview e refresh

    oregon ha scritto:


    Esegui nuovamente la SELECT dopo la DELETE
    Oppure, se sei in monoutenza, dato che sai cosa stai cancellando lo elimini con la DELETE dal DB e rimuovi la riga dalla griglia.
  • Re: Problema datagridview e refresh

    ribelle ha scritto:


    No no da codice, USO INSERT, DELETE e lavoro direttamente sul db.
    Ok.

    ribelle ha scritto:


    Il database si aggiorna ma la tabella non ricarica l'aggiornamento se non esco e rientro.
    Questo mi pare ovvio. Se esegui un comando SQL, puoi fare qualsiasi cosa, su qualsiasi database e qualsiasi tabella, quindi nessuno può determinare cosa è accaduto sul DB e fare aggiornamenti automatici di conseguenza, a meno di non usare strumenti che prevedano questo tipo di interazione (ad esempio, lavorare su cache tipo il DataSet che poi riflettono le modifiche sul DB).

    Inoltre, è proprio un bene che sia così: magari questo aggiornamento automatico è una operazione onerosa e chi dice che debba essere attuata ogni volta che si modifica un record, lo si inserisce oppure lo si elimina?

    ribelle ha scritto:


    datagridview1.refresh non aggiorna.
    Se usi un metodo, che sia Refresh() o qualsiasi altro, devi sapere quello che fa leggendo la documentazione.
    Ad esempio, consulta l'help ufficiale del controllo DataGridView e scoprirai che Refresh() è un metodo che segnala a Windows la necessità di ridisegnare il controllo a video.

    ribelle ha scritto:


    Sicuramente sbaglio quacosa.
    Certamente, poiché il metodo che chiami non c'entra nulla con quello che vuoi fare tu.
    Non puoi programmare "a caso".

    ribelle ha scritto:


    Non usa dataset o datatable
    A maggior ragione, se non fai uso di questi oggetti, la griglia non è in grado di rilevare alcuna modifica e deve essere ricaricata manualmente a fronte di cambiamenti.

    Avrai un metodo che chiami per eseguire il comando di selezione dei record e inizializzazione della suddetta griglia: quando hai fatto l'inserimento, la modifica o la cancellazione, richiama questo metodo per ricaricare di nuovo i dati.

    Se non hai usato DataSet o DataTable, sarei però curioso di capire dove appoggi i dati che visualizzi all'interno della griglia: mi sembra che tu stia impostando l'uso di controlli grafici con un approccio estremamente "manuale", e poi pretenda che da questo procedimento vi siano degli effetti collaterali in grado di supportare automatismi che, ovviamente, facendo le cose in questo modo, non potranno avere luogo. Posta anche un po' di codice, per chiarire questi aspetti.

    Ciao!
  • Re: Problema datagridview e refresh

    Ho creato in un form un datagridview con le colonne che mi servono (ID_MATRIALE, CODICE)

    Lancio un secondo form che mi permette con dei campi di inserire nuovi materiali che però all'uscita non aggiorna il precedente dgw

    Form1 codice

    frmNuovoMateriale.Show()
    caricamateriali()

    questo perchè il comando che apre il secondo form non attende poi la chiusura dello stesso per lanciare caricamateriali()

    Senza cimentarmi con async e await (che dovrebbero comunque sospendere il comando successivo sino al termine del precedente), ho risolto mettendo la sub caricamateriali() un un modulo pubblico e la lancio prima di far chiudere il secondo form (quindi prima aggiorna la datagridwiew del primo e poi chiude) ed ora funziona


    Sub CaricaMateriali()

    frmMateriali.dgwElencoMateriali.Rows.Clear() '''ATTENZIONE riferimento al frmMateriali perchè lanciato da modulo esterno

    ' carico le variabili da una classe esterna che le rende pubbliche
    Dim con As New MySqlConnection("server=" & Mserver & ";port='" & Mport & "';username='" & Musername & "';Password='" & Mpassword & "';database='" & Mdatabase & "';")

    'connessione a MYSQL

    Dim cmd As MySqlCommand
    Dim reader As MySqlDataReader

    cmd = New MySqlCommand("SELECT * FROM Materiali", con)
    con.Open()
    reader = cmd.ExecuteReader

    'popolo la tabella

    While reader.Read
    frmMateriali.dgwElencoMateriali.Rows.Add(reader.GetString(1), reader.GetString(2), reader.GetString(3), reader.GetString(5))


    End While

    con.Close()

    End Sub


    funzione del secondo form che salva i dati e aggiorna fa datagridview della maschera precedente

    Private Sub btnSalva_Click(sender As Object, e As EventArgs) Handles btnSalva.Click

    Dim Salvare As DialogResult = MessageBox.Show("I parametri inseriti verranno salvati nel Database. Procedere con la scrittura?", "Attenzione!!!", MessageBoxButtons.YesNo)


    If Salvare = DialogResult.No Then

    ElseIf Salvare = DialogResult.Yes Then


    Dim con As New MySqlConnection("server=" & Mserver & ";port='" & Mport & "';username='" & Musername & "';Password='" & Mpassword & "';database='" & Mdatabase & "';")


    Dim cmd As MySqlCommand

    cmd = New MySqlCommand("INSERT INTO Materiali (ID_MATRIALE, CODICE) VALUES (DEFAULT, '" & txtCodice.Text )", con)

    con.Open()

    cmd.ExecuteNonQuery()

    con.Close()


    End If


    Me.Close()
    CaricaIndagini()

    End Sub


    Grazie 1000 sempre a tutti per la collaborazione e la celerità dei consigli
  • Re: Problema datagridview e refresh

    Metti il tag CODE o non si capisce un tubo...
  • Re: Problema datagridview e refresh

    Ho creato in un form un datagridview con le colonne che mi servono (ID_MATRIALE, CODICE)

    Lancio un secondo form che mi permette con dei campi di inserire nuovi materiali che però all'uscita non aggiorna il precedente dgw

    Form1 codice
    
    frmNuovoMateriale.Show()
    caricamateriali()
    
    questo perchè il comando che apre il secondo form non attende poi la chiusura dello stesso per lanciare caricamateriali()

    Senza cimentarmi con async e await (che dovrebbero comunque sospendere il comando successivo sino al termine del precedente), ho risolto mettendo la sub caricamateriali() un un modulo pubblico e la lancio prima di far chiudere il secondo form (quindi prima aggiorna la datagridwiew del primo e poi chiude) ed ora funziona
    
    Sub CaricaMateriali()
    
    frmMateriali.dgwElencoMateriali.Rows.Clear() '''ATTENZIONE riferimento al frmMateriali perchè lanciato da modulo esterno
    
    ' carico le variabili da una classe esterna che le rende pubbliche
    Dim con As New MySqlConnection("server=" & Mserver & ";port='" & Mport & "';username='" & Musername & "';Password='" & Mpassword & "';database='" & Mdatabase & "';")
    
    'connessione a MYSQL
    
    Dim cmd As MySqlCommand
    Dim reader As MySqlDataReader
    
    cmd = New MySqlCommand("SELECT * FROM Materiali", con)
    con.Open()
    reader = cmd.ExecuteReader
    
    'popolo la tabella
    
    While reader.Read
    frmMateriali.dgwElencoMateriali.Rows.Add(reader.GetString(1), reader.GetString(2), reader.GetString(3), reader.GetString(5))
    
    
    End While
    
    con.Close()
    
    End Sub
    
    
    funzione del secondo form che salva i dati e aggiorna fa datagridview della maschera precedente
    
    Private Sub btnSalva_Click(sender As Object, e As EventArgs) Handles btnSalva.Click
    
    Dim Salvare As DialogResult = MessageBox.Show("I parametri inseriti verranno salvati nel Database. Procedere con la scrittura?", "Attenzione!!!", MessageBoxButtons.YesNo)
    
    
    If Salvare = DialogResult.No Then
    
    ElseIf Salvare = DialogResult.Yes Then
    
    
    Dim con As New MySqlConnection("server=" & Mserver & ";port='" & Mport & "';username='" & Musername & "';Password='" & Mpassword & "';database='" & Mdatabase & "';")
    
    
    Dim cmd As MySqlCommand
    
    cmd = New MySqlCommand("INSERT INTO Materiali (ID_MATRIALE, CODICE) VALUES (DEFAULT, '" & txtCodice.Text )", con)
    
    con.Open()
    
    cmd.ExecuteNonQuery()
    
    con.Close()
    
    
    End If
    
    
    Me.Close()
    CaricaIndagini()
    
    End Sub
    
    Grazie 1000 sempre a tutti per la collaborazione e la celerità dei consigli
  • Re: Problema datagridview e refresh

    Bastava usare ShowDialog() invece del semplice Show(). Meglio ancora se controllavi il relativo DialogResult e ricaricavi i dati solo se l'inserimento del nuovo materiale è andato a buon fine. Anche se invece che ricaricare tutto, aggiungerei semplicemente il nuovo materiale nella lista che usi per organizzarli.

    P.S: Usa gli Using per connessioni e comandi.
  • Re: Problema datagridview e refresh

    Ora faccio dei test grazie 1000
Devi accedere o registrarti per scrivere nel forum
11 risposte