Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di ric@66
    Registrato dal
    Oct 2011
    Messaggi
    65

    [C#] Caricamento dati periodico in DataGridView duplica righe

    un saluto a tutti, tramite una SELECT vado a leggere dei dati all'interno del mio database (mysql)per poi visualizzarli in una datagridview (c#),questi dati vengono aggiornati da altri utenti frequentemente ,ed io per essere in tempo con gli aggiornamenti faccio ripetere la SELECT da un TIMER ,il problema e' che le entrate ad ogni nuova lettura vengono raddoppiate triplicate e cosi via.
    la SELECT e' la seguente:




    private void timer2_Tick(object sender, EventArgs e)
    {
    MySqlConnection conn = new MySqlConnection("server=localhost;user id=root;password=xxxx;database=risultati");
    conn.Open();


    MySqlDataReader leggi = null;
    MySqlCommand comando = new MySqlCommand("select ORA,DATA,INCONTRO,CAMPO,RISULTATO,PUNTI from ODIERNA ORDER BY ID_DATA DESC ", conn);
    leggi = comando.ExecuteReader();

    while (leggi.Read())



    {
    string ORA = leggi.GetString("ORA");
    string DATA = leggi.GetString("DATA");
    string INCONTRO = leggi.GetString("INCONTRO");
    string CAMPO = leggi.GetString("CAMPO");
    string RISULTATO = leggi.GetString("RISULTATO");
    int PUNTI = leggi.GetInt32("PUNTI");




    int nuovaRiga = dataGridView1.Rows.Add();
    dataGridView1.Rows[nuovaRiga].Cells["oradgw"].Value = ORA;
    dataGridView1.Rows[nuovaRiga].Cells["datadgw"].Value = DATA;
    dataGridView1.Rows[nuovaRiga].Cells["incontrodgw"].Value = INCONTRO;
    dataGridView1.Rows[nuovaRiga].Cells["campodgw"].Value = CAMPO;
    dataGridView1.Rows[nuovaRiga].Cells["risultatodgw"].Value = RISULTATO;
    dataGridView1.Rows[nuovaRiga].Cells["puntidgw"].Value = PUNTI;
    }


    leggi.Close();
    conn.Close();
    }


    il tutto viene ripetuto da un TIMER che ripete l'operazione ogni 10 secondi
    come potrei fare per non raddoppiare le entrate nel datagridview?oppure se esiste un modo per non fargli scrivere i duplicati o qualcosa del genere ,purtroppo non essendo esperto in materia brancolo nel buio. Grazie per l'attenzione

  2. #2
    se rileggi sempre tutto, prima di partire ad aggiungere righe devi svuotare la griglia

  3. #3
    Utente di HTML.it L'avatar di ric@66
    Registrato dal
    Oct 2011
    Messaggi
    65
    Quote Originariamente inviata da optime Visualizza il messaggio
    se rileggi sempre tutto, prima di partire ad aggiungere righe devi svuotare la griglia
    Ciao grazie per la risposta ,provo ad inserire il comando datagridview.Rows.Clear ,volevo chiederti secondo te effettuare un controllo verso db e inserire solo i nuovi record qualora ce ne fossero e' una cosa troppo complicata per me oppure non e' proprio fattibile una cosa del genere?

  4. #4
    dipende, riesci a individuare un campo nelle tue tabelle che riesca a farti capire che quel record non è già in griglia?

  5. #5
    Utente di HTML.it L'avatar di ric@66
    Registrato dal
    Oct 2011
    Messaggi
    65
    Quote Originariamente inviata da optime Visualizza il messaggio
    dipende, riesci a individuare un campo nelle tue tabelle che riesca a farti capire che quel record non è già in griglia?
    purtroppo non avendo un id che autoincrementa l'unico dato potrei prenderlo da data e ora

  6. #6
    allora al caricamento ti potresti memorizzare la data/ora più alta che hai letto e ricominciare da lì.

    Però:
    - in questo modo NON riporti in griglia eventuali modifiche ai record già caricati (ma se i record, una volta scritti nel db, sono immodificabili, questo NON è un problema)
    - vedo inoltre che hai una ORDER BY ID_DATA DESC, per cui sembra che tu esponga in cima gli eventi più recenti --> farai fatica a "spingere" i dati in basso per mettere i nuovi record

    Quindi, se i dati non sono tantissimi e i tempi di ricarica/rendering sono accettabili, ricarica tutto e via

  7. #7
    Utente di HTML.it L'avatar di ric@66
    Registrato dal
    Oct 2011
    Messaggi
    65
    Quote Originariamente inviata da optime Visualizza il messaggio
    allora al caricamento ti potresti memorizzare la data/ora più alta che hai letto e ricominciare da lì.

    Però:
    - in questo modo NON riporti in griglia eventuali modifiche ai record già caricati (ma se i record, una volta scritti nel db, sono immodificabili, questo NON è un problema)
    - vedo inoltre che hai una ORDER BY ID_DATA DESC, per cui sembra che tu esponga in cima gli eventi più recenti --> farai fatica a "spingere" i dati in basso per mettere i nuovi record

    Quindi, se i dati non sono tantissimi e i tempi di ricarica/rendering sono accettabili, ricarica tutto e via
    ok ti ringrazio per i consigli,per quanto riguarda la cancellazione delle righe ho inserito la riga di codice e va' bene
    dataGridView1.Rows.Clear();
    while (leggi.Read())
    l'unica cosa bruttina e' che scorrendo i dati con lo scrollbar ad ogni refresh mi riporta all'inizio dei dati in gridview ,peccato.

  8. #8
    Quote Originariamente inviata da ric@66 Visualizza il messaggio
    ...ho inserito la riga di codice e va' bene
    dataGridView1.Rows.Clear();
    while (leggi.Read())...
    optime!

    Quote Originariamente inviata da ric@66 Visualizza il messaggio
    l'unica cosa bruttina e' che scorrendo i dati con lo scrollbar ad ogni refresh mi riporta all'inizio dei dati in gridview ,peccato.
    visto che svuoti e ri-riempi la grid, questo comportamento è inevitabile

  9. #9
    Utente di HTML.it L'avatar di ric@66
    Registrato dal
    Oct 2011
    Messaggi
    65
    Quote Originariamente inviata da optime Visualizza il messaggio
    optime!



    visto che svuoti e ri-riempi la grid, questo comportamento è inevitabile
    se invece di utilizzare la scrollbar della datagridview ne usassi una con due pulsanti esterna alla datagrid ma associata solo a livello di codice con la funzione up down la cosa potrebbe fuzionare?

  10. #10
    non so / non credo: quando svuoti la griglia per poi ri-riempirla scompaiono tutti i riferimenti.

    Faccio un esempio: il controllo via pulsanti "sa" che sei a riga 20 (è un esempio); svuoti e ri-riempi la grigia --> quale è ora la riga 20? ovvero, la riga 20 contiene ancora quello che conteneva prima?

    Direi che non ne esci: forse l'unica è ricaricare i dati nel momento in cui rilevi che non c'è attività, ma non conosco il tuo applicativo

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 © 2024 vBulletin Solutions, Inc. All rights reserved.