2017-03-14 1 views
-2

J'ai le code, tout va bien jusqu'à ce que je mets le nombre plus grand que 3000, le résultat sera nombre négatif, s'il vous plaît aider.Calcul de la valeur totale est incorrect

Je ne sais pas pourquoi c'est arrivé, je l'ai déjà débogué, ou à propos de je le déclare par int?

La valeur totale que je mentionne est int total = quantité * coût;

Et en passant, est de toute façon à empêcher type d'utilisateur quoi que ce soit d'autre, sauf à format: numérique colonne Quantité?

private void G2_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     try 
     { 
      int quantity, cost; 
      if (int.TryParse(G2.Rows[e.RowIndex].Cells["Quantity"].Value.ToString(), out quantity) && int.TryParse(G2.Rows[e.RowIndex].Cells["Cost2"].Value.ToString(), out cost)) 
      { 
       int total= quantity * cost; 
       G2.Rows[e.RowIndex].Cells["Total"].Value = total.ToString(); 
      } 

      int quan, mini; 

      quan = Convert.ToInt32(G2.Rows[e.RowIndex].Cells["Quantity"].Value); 
      mini = Convert.ToInt32(G2.Rows[e.RowIndex].Cells["MinimumOrder2"].Value); 

      if (quan < mini) 
      { 
       MessageBox.Show("QUANTITY must be GREATER or EQUAL to MINIMUM ORDER", "STOP", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       G2.Rows[e.RowIndex].Cells["Quantity"].Value = ""; 
       G2.Rows[e.RowIndex].Cells["Total"].Value = ""; 
       return; 

      } 
      else 
      { 
       //Sum the Total Column to TOTAL VALUES text box 
       decimal TotalValue = 0; 
       for (int i = 0; i < G2.Rows.Count; i++) 
       { 
        if (G2.Rows[i].Cells["Total"].Value == DBNull.Value) 
        { 
         return; 
        } 
        else 
        { 
         TotalValue += Convert.ToDecimal(G2.Rows[i].Cells["Total"].Value); 
        } 
       } 

       totalvalue.Text = TotalValue.ToString(); 
      } 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Please Enter Only Number"); 
      return; 
     } 

    } 

Example input by user

+0

Pourriez-vous montrer aussi le code de votre DataGrid? – Mixxiphoid

+0

@Mixxiphoid tout fonctionne bien sauf cela. – Serenade

+0

Pourquoi n'essayez-vous pas d'utiliser le débogueur pour vérifier ce qu'il se passe dans ce code? Cela semble quelque chose lié à vos données réelles. – Steve

Répondre

0

Une question est la "boucle totale". Je pense que le return devrait être un continue.

if (G2.Rows[i].Cells["Total"].Value == DBNull.Value) 
{ 
    continue; 
} 

Une autre question est que le calcul total pour la cliqué sur la ligne est calculée comme int pas decimial. Modifier le code à:

int quantity; 
decimal cost; 
if(int.TryParse(G2.Rows[e.RowIndex].Cells["Quantity"].Value.ToString(), out quantity) && 
    decimal.TryParse(G2.Rows[e.RowIndex].Cells["Cost2"].Value.ToString(), out cost)) 
     { 
      int total= quantity * cost; 
      G2.Rows[e.RowIndex].Cells["Total"].Value = total.ToString(); 
     } 
+0

je l'ai utilisé pour éviter l'erreur L'objet ne peut pas être transtypé de DBNull à d'autres types. Donc, si elle est nulle, retour, laissez les utilisateurs finir leurs entrées – Serenade

+0

cette ligne est erronée ** int total = quantité * coût; ** – Serenade

+0

Je ne peux pas taper int au total car le coût est en décimal – Serenade

0

Un autre problème peut permettre à l'utilisateur d'entrer les valeurs dans Total. Et Voici le code pour permettre uniquement des chiffres en champ Quantité

private void G2_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     String sCellName = G2.Columns[G2.CurrentCell.ColumnIndex].Name.ToUpper(); 
     if (sCellName == "QUANTITY") //----change with yours 
     { 

      e.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress); 


     } 
    } 

    private void Control_KeyPress(object sender, KeyPressEventArgs e) 
    { 

     if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.') 
     { 
      e.Handled = true; 
     } 

     // only allow one decimal point 
     if (e.KeyChar == '.' 
      && (sender as TextBox).Text.IndexOf('.') > -1) 
     { 
      e.Handled = true; 
     } 
    } 
+0

Je peux encore taper "hhhh" "aaaa" à la cellule, J'ajoute déjà EdittingControlShowing à l'événement datagridview sur le Control_Keypress, Où dois-je ajouter ceci? – Serenade

+0

Pouvez-vous vérifier que le nom du champ de quantité est le même que celui fourni? – Sandeep

+0

'Chaîne sCellName = G2.Columns [G2.CurrentCell.ColumnIndex] .Name.ToUpper(); if (sCellName == "Quantité") // ---- change avec le vôtre { e.Control.KeyPress + = nouveau KeyPressEventHandler (Ctrl_Commande); } ' yes le champ Nom de quantité est Quantité – Serenade

1

[RESOLU] Dont l'utilisation int plus, changez-en décimal

private void G2_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
    try 
    { 
     decimal quantity, cost; 
     if (decimal .TryParse(G2.Rows[e.RowIndex].Cells["Quantity"].Value.ToString(), out quantity) && decimal .TryParse(G2.Rows[e.RowIndex].Cells["Cost2"].Value.ToString(), out cost)) 
     { 
      decimal total= quantity * cost; 
      G2.Rows[e.RowIndex].Cells["Total"].Value = total.ToString(); 
     } 

     int quan, mini; 

     quan = Convert.ToInt32(G2.Rows[e.RowIndex].Cells["Quantity"].Value); 
     mini = Convert.ToInt32(G2.Rows[e.RowIndex].Cells["MinimumOrder2"].Value); 

     if (quan < mini) 
     { 
      MessageBox.Show("QUANTITY must be GREATER or EQUAL to MINIMUM ORDER", "STOP", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      G2.Rows[e.RowIndex].Cells["Quantity"].Value = ""; 
      G2.Rows[e.RowIndex].Cells["Total"].Value = ""; 
      return; 

     } 
     else 
     { 
      //Sum the Total Column to TOTAL VALUES text box 
      decimal TotalValue = 0; 
      for (int i = 0; i < G2.Rows.Count; i++) 
      { 
       if (G2.Rows[i].Cells["Total"].Value == DBNull.Value) 
       { 
        return; 
       } 
       else 
       { 
        TotalValue += Convert.ToDecimal(G2.Rows[i].Cells["Total"].Value); 
       } 
      } 

      totalvalue.Text = TotalValue.ToString(); 
     } 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Please Enter Only Number"); 
     return; 
    } 

}