29/03/23 12:48
pacifico
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.
aaa
29/03/23 15:21
Carlo
Ultima modifica effettuata da Carlo 29/03/23 15:27
in programmazione tutto è permesso
29/03/23 21:56
Carlo
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:
dataGridView1.Rows[r].Cells[c] // r e c = riga e colonna
messo in pratica:
private void TextBox9_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
var MyString = TextBox9.Text;
if (string.IsNullOrWhiteSpace(MyString))
{
TextBox9.Focus();
return;
}
else
{
// se si è premuto enter ed è stata immessa una stringa
Numero = TextBox9.Text.ToString();
decimal valore = 0;
if (decimal.TryParse(Numero, out valore))
{
/* in riga 1 colonna 3 metto il risultato della moltiplicazione
tra la TextBox9 (Numero, valore) e il dato contenuto in riga 1 colonna 2 */
DataGridView.Rows[1].Cells[3].Value = decimal.Parse(DataGridView.Rows[1].Cells[2].Value.ToString()) * valore;
}
}
}
// Accetta solo numeri punti e virgole //
char ch = e.KeyChar;
if (!Char.IsDigit(ch) && ch != 8)
{
e.Handled = true;
}
if (ch == 44 || ch == 46)
{
e.Handled = false;
}
// Numero = TextBox9.Text.ToString(); // non serve aggiornare Numero ogni carattere digitato
}
Ultima modifica effettuata da Carlo 30/03/23 6:53
in programmazione tutto è permesso
30/03/23 14:07
pacifico
Gent.mo Carlo,
ringrazio e scusa del ritardo per prove e modifiche.
Risolto, funziona perfettamente.
Buon proseguimento, saluto.
Domenico
aaa
01/04/23 6:33
pacifico
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.
aaa
01/04/23 8:44
Carlo
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.
private void TextBox9_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
var MyString = TextBox9.Text;
if (string.IsNullOrWhiteSpace(MyString))
{
TextBox9.Focus();
return;
}
else
{
// se si è premuto enter ed è stata immessa una stringa
Numero = TextBox9.Text.ToString();
decimal valore = 0;
if (decimal.TryParse(Numero, out valore))
{
/* in riga 1 colonna 3 metto il risultato della moltiplicazione
tra la TextBox9 (Numero, valore) e il dato contenuto in riga 1 colonna 2 */
DataGridView.Rows[1].Cells[3].Value = decimal.Parse(DataGridView.Rows[1].Cells[2].Value.ToString()) * valore;
}
}
}
// Accetta solo numeri e virgole //
char ch = e.KeyChar;
if (!Char.IsDigit(ch) && ch != 8)
{
e.Handled = true;
}
if (ch == 44) // solo la virgola è ammessa, se vuoi solo il punto allora: if (ch == 46)
// oppure metti un if che sceglie 44 se la cultura è "it-IT" e 46 se la cultura è "en-US" o "en-UK"
{
e.Handled = false;
}
// Numero = TextBox9.Text.ToString(); // non serve aggiornare Numero ogni carattere digitato
}
Lo stesso discorso vale per i valori importati e mostrati sul DataGridView
Ultima modifica effettuata da Carlo 01/04/23 15:56
in programmazione tutto è permesso