Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126

    [c#] ListView refresh dopo databind

    la parola databind non rende giustizia a quello che faccio al listview in quanto non faccio un vero e proprio databind con un oggetto datasource ma semplicemente itero tra i record di una tabella con un datareader per popolare le items del listview.
    Premesso questo, mi stò scontrando con un problemino:
    Ho una form dove al load itero appunto sui record di una tabella e popolo un listview.. e fin qui tutto bene..
    su questa stessa form ho un pulsante che ne apre un'altra dove ho ancora un'altro pusante che se clicco và ad aggiungere un record nella tabella che uso per poplare il listview.. sempre in questo pulsante richiamo la funzione del primo form che popola il listview, la stessa che utilizzo nel load del primo form.. la funzione viene richiamata (ho provato da debug) ma il listview non mi mostra il record appena immesso.. ho rpovato a richiamare il refresh del listview e l'update ma niente..
    Qualcuno ha idea del perchè questa cavolo di listview non si aggiorna con il nuovo record se provo a richiamare la funzione da un'altra form? se provo a richiamarla dal form dove'è il listview le items si accodano normalmente

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Non penso sia un problema di "refresh" e "update". Controlla il codice con cui viene effettuato il caricamento degli elementi e che deve essere nuovamente eseguito (avendo cura, ovviamente, di ricaricare anche tali oggetti con il record aggiuntivo) da invocare quando il form di inserimento/modifica del record è stato chiuso ed ha compiuto il proprio lavoro.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da alka
    Non penso sia un problema di "refresh" e "update". Controlla il codice con cui viene effettuato il caricamento degli elementi e che deve essere nuovamente eseguito (avendo cura, ovviamente, di ricaricare anche tali oggetti con il record aggiuntivo) da invocare quando il form di inserimento/modifica del record è stato chiuso ed ha compiuto il proprio lavoro.

    Ciao!
    uhm.. ma mi sà che è quello che faccio:
    Codice di inserimento nuovo record (form 2)
    codice:
    OleDbConnection cn = new OleDbConnection(ConfigurationManager.ConnectionStrings["localDb"].ConnectionString);
                    OleDbCommand cmd = new OleDbCommand("INSERT INTO nazioni (codnazione,descnazione) VALUES (@codice,@descrizione)", cn);
                    cmd.Parameters.Add("@codice", OleDbType.VarChar, 3);
                    cmd.Parameters.Add("@descrizione", OleDbType.VarChar, 50);
                    cmd.Parameters["@codice"].Value = txtCod.Text;
                    cmd.Parameters["@descrizione"].Value = txtDesc.Text;
                    cn.Open();
                    cmd.ExecuteNonQuery();
                    cn.Close();
                    frmKeyValue = new FormKeyValue();
                    frmKeyValue.populateList();
                    this.Close();
    Codice prelevamento record (form 1)
    codice:
    public void populateList() 
            {
                this.Cursor = Cursors.WaitCursor;
                lvItems.Enabled = false;
                btnNew.Enabled = false;
                btnEdit.Enabled = false;
                btnSelect.Enabled = false;
                btnDelete.Enabled = false;
                btnPrint.Enabled = false;
                btnExit.Enabled = false;
                Application.DoEvents();
    
                cn = new OleDbConnection(ConfigurationManager.ConnectionStrings["localDb"].ConnectionString);
                cmd = new OleDbCommand("Select idNazioni,codnazione,descnazione from nazioni order by codnazione asc", cn);
                cn.Open();
                Application.DoEvents();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    ListViewItem lvItem = new ListViewItem(reader[1].ToString());
                    lvItem.SubItems.Add(reader[2].ToString());
                    lvItems.Items.Add(lvItem);
    
                }
                cn.Close();
                cn.Dispose();
                this.Cursor = Cursors.Default;
                lvItems.Enabled = true;
                btnNew.Enabled = true;
                btnEdit.Enabled = true;
                btnSelect.Enabled = true;
                btnDelete.Enabled = true;
                btnPrint.Enabled = true;
                btnExit.Enabled = true;
                Application.DoEvents();
               
            }
    dove sbaglio?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Non capisco, non è il Form contenente il controllo ListView a richiamare il Form secondario che aggiunge il record?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da alka
    Non capisco, non è il Form contenente il controllo ListView a richiamare il Form secondario che aggiunge il record?
    esatto.. richiama il form secondario che si apre, dove c'è un pulsante e due textbox e dove scrivo il record nel db.. ma in questo stesso form richiamo la funzione pubblica populateList() che si trova nel form principale e che utilizzo anche nel load del form principale per popolare il listview all'apertura di questo..
    la funzione richiamata dal form secondario viene eseguita sicuramente ma il listview non si ripopola con il record aggiunto, mentre se la richiamo dal form dove è istanziata mi popola correttamente il listview..

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da dops
    esatto.. richiama il form secondario che si apre, dove c'è un pulsante e due textbox e dove scrivo il record nel db..
    Originariamente inviato da dops
    ma in questo stesso form richiamo la funzione pubblica populateList() che si trova nel form principale e che utilizzo anche nel load del form principale per popolare il listview all'apertura di questo..
    No, tu crei una nuova istanza del form chiamante e chiami il metodo populateList di quell'istanza; in sostanza, stai aggiornando un form equivalente al chiamante, appena creato, mai visualizzato.

    Originariamente inviato da dops
    la funzione richiamata dal form secondario viene eseguita sicuramente ma il listview non si ripopola con il record aggiunto, mentre se la richiamo dal form dove è istanziata mi popola correttamente il listview..
    Secondo me, ci sono molti errori nel codice che hai riportato.

    In primo luogo, l'uso di molti Application.DoEvents che potrebbero comportare diversi problemi.

    La chiusura di molte connessioni non è garantita con il costrutto try...catch.

    Il form secondario dovrebbe essere modale e restituire un valore di ritorno che segnali la conferma o l'annullamento, dopo aver provveduto a salvare il record (o a... far nulla, in caso di annullamento dell'operazione).

    L'aggiornamento della ListView dovrebbe essere introdotto nel form chiamante, a seguito della chiusura del form secondario, solo se quest'ultimo ha confermato l'inserimento di un nuovo record.

    Nel caso in cui non si tratti di un form modale, si dovrebbe passare un riferimento del form chiamante al form secondario di inserimento che consenta a questo di sfruttare tale riferimento per invocare l'aggiornamento per l'oggetto che rappresenta il form chiamante, quell'istanza specifica, senza creare un nuovo form.

    Più in generale, insomma, ci vorrebbe un approfondimento della programmazione OOP in quanto tale, indispensabile per sviluppare correttamente in .NET.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da alka
    No, tu crei una nuova istanza del form chiamante e chiami il metodo populateList di quell'istanza; in sostanza, stai aggiornando un form equivalente al chiamante, appena creato, mai visualizzato.


    Secondo me, ci sono molti errori nel codice che hai riportato.

    In primo luogo, l'uso di molti Application.DoEvents che potrebbero comportare diversi problemi.

    La chiusura di molte connessioni non è garantita con il costrutto try...catch.

    Il form secondario dovrebbe essere modale e restituire un valore di ritorno che segnali la conferma o l'annullamento, dopo aver provveduto a salvare il record (o a... far nulla, in caso di annullamento dell'operazione).

    L'aggiornamento della ListView dovrebbe essere introdotto nel form chiamante, a seguito della chiusura del form secondario, solo se quest'ultimo ha confermato l'inserimento di un nuovo record.

    Nel caso in cui non si tratti di un form modale, si dovrebbe passare un riferimento del form chiamante al form secondario di inserimento che consenta a questo di sfruttare tale riferimento per invocare l'aggiornamento per l'oggetto che rappresenta il form chiamante, quell'istanza specifica, senza creare un nuovo form.

    Più in generale, insomma, ci vorrebbe un approfondimento della programmazione OOP in quanto tale, indispensabile per sviluppare correttamente in .NET.

    Ciao!
    uhm.. diciamo che a parte il predicozzo gratuito senza che ti abbia detto che si tratta di codice non ottimizzato in quanto in fase di "test", vorrei chiarire che innanzitutto si tratta di form modale (ovviamente il form che viene richiamato) e non riesco a capire da cosa hai dedotto che non lo sia visto che non ti ho fatto vedere come apro il secondo form.
    Application.DoEvents() è utilizzato in modo molto generico per lo stesso motivo di cui sopra "test", cmq credo sia molto utile e che vada utilizzata molto + spesso di quanto non si creda, molti aprono diversi thread inutilmente quando un Application.DoEvents() risulta molto + performante.
    Sono sempre in fase di test e sò anch'io come utilizzare il costrutto try catch finally.
    Molto probabilmente l'errore stà proprio nel fatto che istanzio un form già istanziato, come mi hai fatto notare.
    Grazie

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da dops
    uhm.. diciamo che a parte il predicozzo gratuito senza che ti abbia detto che si tratta di codice non ottimizzato in quanto in fase di "test" [...]
    Se pretendi che ti dia suggerimenti in base a quanto non posso vedere perché non lo scrivi, hai una bella pretesa. :master:

    Originariamente inviato da dops
    vorrei chiarire che innanzitutto si tratta di form modale (ovviamente il form che viene richiamato) e non riesco a capire da cosa hai dedotto che non lo sia visto che non ti ho fatto vedere come apro il secondo form.
    Come dicevo prima, se tu lo avessi scritto, non ci sarebbe stato bisogno di sprecare tempo da parte mia per spiegare qualcosa di inutile. Se poi si impiega caratteri e si cerca di illustrare quante più cose possibili e te la prendi perché non ho indovinato qualcosa che non hai detto e che avresti dovuto dire, non so che dirti.

    In ogni caso, non capisco il tuo discorso: come fai a non capire la mia deduzione sul fatto che tu non abbia seguito lo schema che ho illustrato se tutto il codice che hai mostrato semplicemente non si inserisce nel contesto così come l'ho descritto?

    Non mi hai fatto vedere come apri il secondo form, ma è lampante che non lo apri così come ho descritto io: non c'è l'aggiornamento del form chiamante nel codice del form chiamante stesso, visto che si trova nel codice del form secondario (questo però l'hai postato), a meno che tu non lo richiami dall'una e dall'altra parte; in ogni caso, è una soluzione diversa da quella che ho postato io, questo almeno mi sembra evidente. In secondo luogo, senz'altro non raccogli dal form chiamante il risultato dell'operazione nel form secondario: siccome il form secondario provvede ad aggiornare e a fare tutte le operazioni correlate, qualsiasi operazione di questo tipo duplicata nel form chiamante sarebbe inutile, quindi se c'è e non potevo saperlo, sarebbe comunque errata, se non c'è andrebbe spostata in quel luogo; anche in questo caso, comunque, la tua soluzione è diversa.

    Originariamente inviato da dops
    Application.DoEvents() è utilizzato in modo molto generico per lo stesso motivo di cui sopra "test"
    Ma che significa "test": se inserisco qualcosa nel codice che non ha un senso e chiedo ad altri di fornire un giudizio, il fatto che si tratti di un "test" non rende un'istruzione inutile significativa.

    Originariamente inviato da dops
    cmq credo sia molto utile e che vada utilizzata molto + spesso di quanto non si creda, molti aprono diversi thread inutilmente quando un Application.DoEvents() risulta molto + performante.
    Contrariamente a quanto si creda, è tutt'altro che performante e molti fanno la scelta giusta sapendo come funzionano i thread e pertanto utilizzandoli per lo scopo per cui sono nati, evitando come la peste l'uso di DoEvents che introduce solamente possibili effetti collaterali se non si provvede a "blindare" qualsiasi parte dell'applicazione.

    Se i thread non funzionano a dovere, la soluzione è sfruttarli nel modo opportuno e corretto; l'uso di Application.DoEvents in questo contesto è un palliativo.

    Originariamente inviato da dops
    Sono sempre in fase di test e sò anch'io come utilizzare il costrutto try catch finally.
    Onestamente, non capisco cosa ti impedisca di scrivere codice corretto pur trovandoti nella cosiddetta "fase di test" (con cui generalmente si identifica il processo per la verifica del funzionamento di classi e metodi già conclusi, non di creazioni, distruzioni e chiusure gettate alla rinfusa).

    Nei metodi che hai postato hai usato Dispose in uno, nell'altro no.

    Usare un approccio differente in metodi diversi cambia il funzionamento del codice, e questo avviene soprattutto in un ambiente "gestito" quale è .NET.

    Originariamente inviato da dops
    Molto probabilmente l'errore stà proprio nel fatto che istanzio un form già istanziato, come mi hai fatto notare.
    Meno male che questo non era incluso nel test.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da alka
    Se pretendi che ti dia suggerimenti in base a quanto non posso vedere perché non lo scrivi, hai una bella pretesa. :master:


    Come dicevo prima, se tu lo avessi scritto, non ci sarebbe stato bisogno di sprecare tempo da parte mia per spiegare qualcosa di inutile. Se poi si impiega caratteri e si cerca di illustrare quante più cose possibili e te la prendi perché non ho indovinato qualcosa che non hai detto e che avresti dovuto dire, non so che dirti.

    In ogni caso, non capisco il tuo discorso: come fai a non capire la mia deduzione sul fatto che tu non abbia seguito lo schema che ho illustrato se tutto il codice che hai mostrato semplicemente non si inserisce nel contesto così come l'ho descritto?

    Non mi hai fatto vedere come apri il secondo form, ma è lampante che non lo apri così come ho descritto io: non c'è l'aggiornamento del form chiamante nel codice del form chiamante stesso, visto che si trova nel codice del form secondario (questo però l'hai postato), a meno che tu non lo richiami dall'una e dall'altra parte; in ogni caso, è una soluzione diversa da quella che ho postato io, questo almeno mi sembra evidente. In secondo luogo, senz'altro non raccogli dal form chiamante il risultato dell'operazione nel form secondario: siccome il form secondario provvede ad aggiornare e a fare tutte le operazioni correlate, qualsiasi operazione di questo tipo duplicata nel form chiamante sarebbe inutile, quindi se c'è e non potevo saperlo, sarebbe comunque errata, se non c'è andrebbe spostata in quel luogo; anche in questo caso, comunque, la tua soluzione è diversa.


    Ma che significa "test": se inserisco qualcosa nel codice che non ha un senso e chiedo ad altri di fornire un giudizio, il fatto che si tratti di un "test" non rende un'istruzione inutile significativa.


    Contrariamente a quanto si creda, è tutt'altro che performante e molti fanno la scelta giusta sapendo come funzionano i thread e pertanto utilizzandoli per lo scopo per cui sono nati, evitando come la peste l'uso di DoEvents che introduce solamente possibili effetti collaterali se non si provvede a "blindare" qualsiasi parte dell'applicazione.

    Se i thread non funzionano a dovere, la soluzione è sfruttarli nel modo opportuno e corretto; l'uso di Application.DoEvents in questo contesto è un palliativo.


    Onestamente, non capisco cosa ti impedisca di scrivere codice corretto pur trovandoti nella cosiddetta "fase di test" (con cui generalmente si identifica il processo per la verifica del funzionamento di classi e metodi già conclusi, non di creazioni, distruzioni e chiusure gettate alla rinfusa).

    Nei metodi che hai postato hai usato Dispose in uno, nell'altro no.

    Usare un approccio differente in metodi diversi cambia il funzionamento del codice, e questo avviene soprattutto in un ambiente "gestito" quale è .NET.


    Meno male che questo non era incluso nel test.
    hahah
    ma chi ti ha detto che me la sono presa.. cmq giusto per.. quando dici:
    In ogni caso, non capisco il tuo discorso: come fai a non capire la mia deduzione sul fatto che tu non abbia seguito lo schema che ho illustrato se tutto il codice che hai mostrato semplicemente non si inserisce nel contesto così come l'ho descritto?
    ti dico: guarda che quello che mi hai detto sul form da non reistanziare me lo hai scritto dopo che io avevo scritto il post con il codice..
    una domanda.. quando tu inizi un programma ed inizi a scrivere qualche riga di codice.. non ti capita di fare il debug per vedere se quell'evento "click" funziona pensando dopo a come ottimizzare (se inizi a scrivere subito del codice ottimizzato allora chiedo perdono)? bhè io sono proprio in quella fase.. niente beta o alpha.. semplicemente "test" non sò come altro chiamarlo..
    Ultima cosa.. permettimi di non essere daccordo su tuo pensiero sull'utilizzo di Application.DoEvents(), è chiaro bisogna capire quando utilizzare Application.DoEvents() e quando un thread.. ma mi sà che su questa cosa non ci veniamo incontro (come in altre probabilmente per mia inesperienza) perchè Application.DoEvents() tu non lo utilizzerai mai da quanto ho capito.
    Dispose(); ? ma dove? ho usato Close();

  10. #10
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    una domanda.. mi stà capitando una cosa strana:
    codice:
            private void btnConfirm_Click(object sender, EventArgs e)
            {
                try
                {
                    cn = new OleDbConnection(ConfigurationManager.ConnectionStrings["localDb"].ConnectionString);
                    OleDbCommand cmd = new OleDbCommand("INSERT INTO nazioni (codnazione,descnazione) VALUES (@codice,@descrizione)", cn);
                    cmd.Parameters.Add("@codice", OleDbType.VarChar, 3);
                    cmd.Parameters.Add("@descrizione", OleDbType.VarChar, 50);
                    cmd.Parameters["@codice"].Value = txtCod.Text;
                    cmd.Parameters["@descrizione"].Value = txtDesc.Text;
                    cn.Open();
                    cmd.ExecuteNonQuery();
                    ((FormKeyValue)frmKeyValue).lvItems.Items.Clear();
                    ((FormKeyValue)frmKeyValue).populateList();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
                finally
                {
                    if (cn.State == ConnectionState.Open)
                    {
                        cn.Close();
                    }
                    this.Close();
                }
            }
    se ometto il blocco finally chiudendo la connessione e il form appena dopo populateList() tutto funziona normalmente (il listview del form principale si aggiorna correttamente con il record appena inserito) mentre se lascio come ho appena scritto, il listview non si aggiorna
    secondo te perchè?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.