268 messaggi dal 25 novembre 2010
salve e ancora buon natale a tutti!

avrei un problemino con il refresh delle DataGridView.
per riempirne una ho fatto così:
 private void fillEntrate()
        {
            dataGridViewEntrate.DataSource = "";
            try
            {
                dataGridViewEntrate.AutoGenerateColumns = false;

                DataGridViewTextBoxColumn idCol = new DataGridViewTextBoxColumn();
                idCol.Name = "Entrata id";
                idCol.DataPropertyName = "entrata_id";
                idCol.ReadOnly = true;
                idCol.Visible = false;
                dataGridViewEntrate.Columns.Add(idCol);

                DataGridViewTextBoxColumn valoreCol = new DataGridViewTextBoxColumn();
                valoreCol.Name = "Valore";
                valoreCol.DataPropertyName = "entrata_valore";
                valoreCol.ReadOnly = true;
                dataGridViewEntrate.Columns.Add(valoreCol);

                DataGridViewTextBoxColumn causaleCol = new DataGridViewTextBoxColumn();
                causaleCol.Name = "Causale";
                causaleCol.DataPropertyName = "causale_nome";
                causaleCol.ReadOnly = true;
                dataGridViewEntrate.Columns.Add(causaleCol);

                DataGridViewTextBoxColumn contoCol = new DataGridViewTextBoxColumn();
                contoCol.Name = "Conto";
                contoCol.DataPropertyName = "conto_nome";
                contoCol.ReadOnly = true;
                dataGridViewEntrate.Columns.Add(contoCol);

                DataGridViewTextBoxColumn dataCol = new DataGridViewTextBoxColumn();
                dataCol.Name = "Data";
                dataCol.DataPropertyName = "entrata_data";
                dataCol.ReadOnly = true;
                dataGridViewEntrate.Columns.Add(dataCol);

                DataGridViewTextBoxColumn noteCol = new DataGridViewTextBoxColumn();
                noteCol.Name = "Note";
                noteCol.DataPropertyName = "entrata_note";
                noteCol.ReadOnly = true;
                dataGridViewEntrate.Columns.Add(noteCol);

                dataGridViewEntrate.DataSource = db.getEntrate();
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

poi ho creato un bottone con un evento che richiama semplicemente questo metodo in modo da poter rinfrescarla.
il problema è che si duplicano le colonne.
come posso aggrionare la DGV??
5.610 messaggi dal 09 febbraio 2002
Contributi
Ciao, buone feste anche a te :)

Prova a racchiudere in un IF la definizione delle colonne. Una cosa simile:
if (dataGridViewEntrate.Columns.Count==0){
  DataGridViewTextBoxColumn idCol = new DataGridViewTextBoxColumn();
  idCol.Name = "Entrata id";
  //...
}
dataGridViewEntrate.DataSource = db.getEntrate();
Così andrai ad aggiungere le colonne solo se la collezione .Columns non conteneva già degli elementi.

Un'osservazione veloce: se pensi che si possano verificare eccezioni, allora il try/catch dovresti spostarlo nel punto in cui istanzi l'oggetto MySqlConnection o esegui l'Execute del MySqlCommand. Così avresti l'opportunità di gestire l'errore (o rilanciarne uno più idoneo) e far restiture a .getEntrate() un null o una lista vuota.

ciao

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
268 messaggi dal 25 novembre 2010
ok grazie così funziona.
la GridView si aggiorna e le colonne nn si duplicano.

per quanto riguarda i try/catch ho ripreso un abitudine che mi avevano consigliato, e cioè di far uscire fuori l'eventuale errore nella parte grafica.
ognuno dice la sua.
grazie per il consiglio, lo terrò a mente!!
5.610 messaggi dal 09 febbraio 2002
Contributi
ciao,

fermat ha scritto:
per quanto riguarda i try/catch ho ripreso un abitudine che mi avevano consigliato, e cioè di far uscire fuori l'eventuale errore nella parte grafica.

Effettivamente, se l'errore non può essere ignorato è giusto che l'eccezione arrivi all'interfaccia grafica in modo che l'utente ne sia informato. Tuttavia, secondo me, il messaggio nudo e crudo di una MySqlException non dà alcuna informazione all'utente, o meglio, magari riesce a capire che manca la connessione al DB ma all'atto pratico non gli fornisce aiuto su come risolvere la cosa.
La MySqlException dovrebbe essere catturata nel punto in cui ti colleghi al db, loggata in qualche modo (es. event log) e poi rilanciata in qualcosa che possa essere più fruibile da un utente.

try { ... }
catch (MySqlException ex)
{
  //qui logghi l'eccezione nell'event log

  //poi rilanci una tua eccezione incapsulando quella originale
  throw new Exception("Impossibile collegarsi al database. Assicurati di essere collegato alla rete o contatta l'amministratore per assistenza.", ex);
}
Nel caso l'interfaccia grafica, per qualche motivo, volesse risalire all'eccezione originale può pur sempre accedere alla proprietà .InnerException.

try{
dataGridViewEntrate.DataSource = db.getEntrate();
} catch (Exception ex) {
MessageBox.Show(ex.Message);
//ex.InnerException è la MySqlException originale
}


Così hai anche il vantaggio di isolare meglio l'interfaccia grafica dallo strato di accesso ai dati. Lì infatti non vedi più alcun riferimento a MySqlException e questo ti rende libero, in futuro, di passare a MySql a Sql Server senza per questo dover revisionare tutto il codice alla ricerca di occorrenze da sostituire.

ciao.

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
268 messaggi dal 25 novembre 2010
per quanto riguarda il tipo di messaggio hai ragione, ma essendo per me l'applicazione nn ci avevo perso tempo.

invece interessante l'altra cosa.
nn conoscevo la proprietà InnerException.
do una sistemata a la provo.
grazie per il consiglio!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC