Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - C# effettuare la moltiplicazione su una colonna del DataGridView.
Forum - C# / VB.NET - C# effettuare la moltiplicazione su una colonna del DataGridView.

Avatar
pacifico (Normal User)
Rookie


Messaggi: 34
Iscritto: 11/12/2012

Segnala al moderatore
Postato alle 14:48
Mercoledì, 29/03/2023
Buongiorno,

non sono riuscito trovare nessun esempio in rete e sono a chiedere il procedimento per effettuare la moltiplicazione su una colonna del DataGridView.

in una colonna del DataGridView sono inseriti i "Valori numerici con decimali" ed alla seconda colonna è dedicata agli "Importi".

Inserendo un importo intero alla TextBox con evento KeyPress e, moltiplicato con i valori numerici inseriti alla colonna del DataGridView, dovrebbero apparire alla colonna "Importo", i risultati.

Auguro che possiate suggerire e fiducioso, ringrazio anticipatamente
Domenico.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:21
Mercoledì, 29/03/2023
Hai scritto qualcosa? C# o VB?

Qui abbiamo già parlato di DataGridView: http://www.pierotofy.it/pages/extras/forum/16/1068322-c_so ...
se sommi o moltiplichi poco cambia.

Posta quello che hai scritto sotto all'evento KeyPress...

Ultima modifica effettuata da Carlo il 29/03/2023 alle 17:27


in programmazione tutto è permesso
PM Quote
Avatar
pacifico (Normal User)
Rookie


Messaggi: 34
Iscritto: 11/12/2012

Segnala al moderatore
Postato alle 19:44
Mercoledì, 29/03/2023
Gent.mo Carlo,
ringrazio della gradita disponibilità e mi scuso se faccio perdere del tempo prezioso e ne sono rammaricato. Il calcolo della somma di una colonna funziona perfettamente. Non riesco a riempire la colonna adiacente con gli importi inserendo un numero intero alla TextBox con evento KeyPress.

Ho dichiarato una variabile:  string Numero

Riporto il codice della TextBox con l'evento KeyPress che accetta solo numeri:

Codice sorgente - presumibilmente C++

  1. private void TextBox9_KeyPress(object sender, KeyPressEventArgs e)
  2. {
  3.   if (e.KeyChar == (char)Keys.Enter)
  4.   {
  5.     var MyString = TextBox9.Text;
  6.     if (string.IsNullOrWhiteSpace(MyString))
  7.     {
  8.       TextBox9.Focus();
  9.        return;
  10.     }
  11. }
  12.       // Accetta  solo  numeri  //
  13. char ch = e.KeyChar;  
  14. if (!Char.IsDigit(ch) && ch != 8)
  15. {
  16.   e.Handled = true;
  17. }
  18. if (ch == 44 || ch == 46)
  19. {
  20.  e.Handled = false;
  21. }
  22.    Numero = TextBox9.Text.ToString();
  23. }



Rinnovo le scuse e ringrazio per la pazienza, fiducioso, saluto
Domenico

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 23:56
Mercoledì, 29/03/2023
Ok.
Con questo codice immetti sulla TextBox9 una stringa che può contenere numeri punti e virgole, che ritrovi nella variabile Numero quando si preme enter.
Attenzione con il tuo codice la stringa immessa non è detto che sarà un numero valido es: 123,,,..456 sarà inseribile.

Che problemi hai per usare la stringa Numero come moltiplicatore di una cella del DataGridView e mettere il risultato nella cella apposita?
Tu già sai che per leggere/scrivere le celle si opera come una battaglia navale:
Codice sorgente - presumibilmente Plain Text

  1. dataGridView1.Rows[r].Cells[c] // r e c = riga e colonna



messo in pratica:

Codice sorgente - presumibilmente Delphi

  1. private void TextBox9_KeyPress(object sender, KeyPressEventArgs e)
  2. {
  3.     if (e.KeyChar == (char)Keys.Enter)
  4.     {
  5.         var MyString = TextBox9.Text;
  6.         if (string.IsNullOrWhiteSpace(MyString))
  7.         {
  8.             TextBox9.Focus();
  9.             return;
  10.         }
  11.         else
  12.         {
  13.             // se si è premuto enter ed è stata immessa una stringa
  14.             Numero = TextBox9.Text.ToString();
  15.             decimal valore = 0;
  16.             if (decimal.TryParse(Numero, out valore))
  17.             {
  18.                 /* in riga 1 colonna 3 metto il risultato della moltiplicazione
  19.                 tra la TextBox9 (Numero, valore) e il dato contenuto in riga 1 colonna 2 */
  20.                 DataGridView.Rows[1].Cells[3].Value = decimal.Parse(DataGridView.Rows[1].Cells[2].Value.ToString()) * valore;
  21.             }
  22.         }
  23.     }
  24.     // Accetta solo numeri punti e virgole //
  25.     char ch = e.KeyChar;
  26.     if (!Char.IsDigit(ch) && ch != 8)
  27.     {
  28.         e.Handled = true;
  29.     }
  30.     if (ch == 44 || ch == 46)
  31.     {
  32.         e.Handled = false;
  33.     }
  34.     // Numero = TextBox9.Text.ToString(); // non serve aggiornare Numero ogni carattere digitato
  35. }


Ultima modifica effettuata da Carlo il 30/03/2023 alle 8:53


in programmazione tutto è permesso
PM Quote
Avatar
pacifico (Normal User)
Rookie


Messaggi: 34
Iscritto: 11/12/2012

Segnala al moderatore
Postato alle 16:07
Giovedì, 30/03/2023
Gent.mo Carlo,

ringrazio e scusa del ritardo per prove e modifiche.
Risolto, funziona perfettamente.
Buon proseguimento, saluto.
Domenico

PM Quote
Avatar
pacifico (Normal User)
Rookie


Messaggi: 34
Iscritto: 11/12/2012

Segnala al moderatore
Postato alle 8:33
Sabato, 01/04/2023
Buongiorno Carlo,

dalle prove effettuate, ho constatato una irregolarità ai calcoli sulle colonne del DataGridView.

I calcoli riconosce i decimali e non riconosce le migliaia mentre per i totali non ci sono problemi.

Ringrazio, ed auguro un buon proseguimento.

Domenico.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 10:44
Sabato, 01/04/2023
Non so quale sia il problema, posso ipotizzare che non hai tenuto tesoro delle info che ti ho dato nella discussione precedente.
Windows tiene conto della cultura impostata, se è "it-IT" il separatore delle terzine è il punto e il separatore dei decimali la virgola: 10.200.700,50 diecimilioniduecentomilasettecento,50
Se inserisci il numero all'americana 10,200,700.50 e la cultura è italiana tryparse o parse eseguirà la convesione in modo sbagliato o non la eseguirà.
Devi decidere con quale cultura lavorare e comportarti di conseguenza.
Il programma può anche adattarsi alla cultura che vuoi con scelta dell'utente o con automatismi più o meno fantasiosi. Tutto dipende da chi deve usare il programma e su quale pc.
La regola è che il programma usa la cultura del S.O. per esempio se è "it-IT" l'utente DEVE immettere i numeri con la virgola decimale. Se l'utente è un caprone e immette un numero con il punto decimale, va avvertito dicendogli che DEVE usare la virgola.
Oppure nel tuo caso visto che controlli i caratteri immessi, accetta solo la virgola decimale se lavori all'italiana.
Codice sorgente - presumibilmente Delphi

  1. private void TextBox9_KeyPress(object sender, KeyPressEventArgs e)
  2. {
  3.     if (e.KeyChar == (char)Keys.Enter)
  4.     {
  5.         var MyString = TextBox9.Text;
  6.         if (string.IsNullOrWhiteSpace(MyString))
  7.         {
  8.             TextBox9.Focus();
  9.             return;
  10.         }
  11.         else
  12.         {
  13.             // se si è premuto enter ed è stata immessa una stringa
  14.             Numero = TextBox9.Text.ToString();
  15.             decimal valore = 0;
  16.             if (decimal.TryParse(Numero, out valore))
  17.             {
  18.                 /* in riga 1 colonna 3 metto il risultato della moltiplicazione
  19.                 tra la TextBox9 (Numero, valore) e il dato contenuto in riga 1 colonna 2 */
  20.                 DataGridView.Rows[1].Cells[3].Value = decimal.Parse(DataGridView.Rows[1].Cells[2].Value.ToString()) * valore;
  21.             }
  22.         }
  23.     }
  24.     // Accetta solo numeri e virgole //
  25.     char ch = e.KeyChar;
  26.     if (!Char.IsDigit(ch) && ch != 8)
  27.     {
  28.         e.Handled = true;
  29.     }
  30.     if (ch == 44) // solo la virgola è ammessa, se vuoi solo il punto allora: if (ch == 46)
  31.                   // oppure metti un if che sceglie 44 se la cultura è "it-IT" e 46 se la cultura è "en-US" o "en-UK"
  32.     {
  33.         e.Handled = false;
  34.     }
  35.     // Numero = TextBox9.Text.ToString(); // non serve aggiornare Numero ogni carattere digitato
  36. }



Lo stesso discorso vale per i valori importati e mostrati sul DataGridView

Ultima modifica effettuata da Carlo il 01/04/2023 alle 17:56


in programmazione tutto è permesso
PM Quote
Avatar
pacifico (Normal User)
Rookie


Messaggi: 34
Iscritto: 11/12/2012

Segnala al moderatore
Postato alle 14:22
Sabato, 01/04/2023
Gent.mo Carlo,

chiedo scusa, stamane per la fretta ho confuso nell'esporre il problema.

La cultura impostata è italiana:


Codice sorgente - presumibilmente C# / VB.NET

  1. CultureInfo culture = new CultureInfo("it-IT");



Il tutto funziona perfettamente, ho inserito un ciclo per avere l'importo per tutta la colonna. Avrei gradito che all'importo nella colonna sia mostrato il punto (separatore di migliaia). Tutto qui.

Rinnovo le scuse ed auguro buone feste.

Domenico.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:33
Sabato, 01/04/2023
per mostrare una stringa che rappresenta un numero con separatore delle migliaia e separatore decimale se serve:

numero.ToString("#,##0.##"); // se dopo il punto metti gli zeri invece di # verranno mostrate sempre due cifre anche se valgono zero

nel caso del tuo codice dove fai la moltiplicazione:
Codice sorgente - presumibilmente Plain Text

  1. DataGridView.Rows[1].Cells[3].Value = (decimal.Parse(DataGridView.Rows[1].Cells[2].Value.ToString()) * valore).ToString("#,##0.00");



se la cultura è "it-IT" verrano messi i punti sulle migliaia e le virgole sul separatore decimale.

Nel tuo caso specifico ricordo che i valori venivano presi da un file .xml con i numeri formattati all'americana. Se hai cambiato l'xml e hai formattato i numeri all'italiana sei a posto.

Se nell'xml hai ancora i numeri formattati all'americana per evitare che nel DataGridView ci siano due formattazioni diverse, devi leggere il file .xml con la cultura impostata a "en-US" e mettere i valori convertiti in double o decimal su delle variabili temporanee e poi impostando la cultura "it-IT" scrivere le variabili temporanee nel DataGridView con .ToString("#,##0.00")
messo in pratica:
Codice sorgente - presumibilmente C#

  1. // per allineare tutto a destra ed avere tutto in colonna
  2. DataGridView.AlternatingRowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
  3. DataGridView.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
  4. // le due culture da cambiare all'occorrenza
  5. System.Globalization.CultureInfo usCulture = new System.Globalization.CultureInfo("en-US");
  6. System.Globalization.CultureInfo itCulture = new System.Globalization.CultureInfo("it-IT");
  7. // Cambio temporaneo della cultura, se nell'xml ci sono numeri con il punto decimale
  8. System.Threading.Thread.CurrentThread.CurrentCulture = usCulture;
  9. decimal n5 = Convert.ToDecimal(nodotextbox5.InnerText);
  10. decimal n6 = Convert.ToDecimal(nodotextbox6.InnerText);
  11. decimal n7 = Convert.ToDecimal(nodotextbox7.InnerText);
  12. decimal n8 = Convert.ToDecimal(nodotextbox8.InnerText);
  13. decimal n9 = Convert.ToDecimal(nodotextbox9.InnerText);
  14. // ripristino della cultura
  15. System.Threading.Thread.CurrentThread.CurrentCulture = itCulture;
  16. DataGridView.Rows.Add(1, " ", n5.ToString("#,##0.00"));
  17. DataGridView.Rows.Add(2, " ", n6.ToString("#,##0.00"));
  18. DataGridView.Rows.Add(3, " ", n7.ToString("#,##0.00"));
  19. DataGridView.Rows.Add(4, " ", n8.ToString("#,##0.00"));
  20. DataGridView.Rows.Add(5, " ", n9.ToString("#,##0.00"));


Ultima modifica effettuata da Carlo il 01/04/2023 alle 17:57


in programmazione tutto è permesso
PM Quote