Oppure

Loading
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
Hai scritto qualcosa? C# o VB?

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

Posta quello che hai scritto sotto all'evento KeyPress...
Ultima modifica effettuata da Carlo 29/03/23 15:27
in programmazione tutto è permesso
29/03/23 17:44
pacifico
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:

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;
    }
}
      // Accetta  solo  numeri  // 
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();
}

Rinnovo le scuse e ringrazio per la pazienza, fiducioso, saluto
Domenico
aaa
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
01/04/23 12:22
pacifico
Gent.mo Carlo,

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

La cultura impostata è italiana:


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.
aaa