2011-05-26 5 views
1

Je crée une application dans laquelle l'utilisateur remplit une facture/facture en utilisant un DataGridView.DataGridView Winforms Value, EdittedFormattedValue

Dans chaque ligne de DGV, il y a 4 colonnes:
CreditOrDebit, Customer, Credit, Debit.

CreditOrDebit peut avoir 2 valeurs: BY ou TO 1) Si c'est à la cellule Le crédit sera en lecture seule avec une valeur fixe de 0.00 et le débit sera rempli par l'utilisateur. 2) Si c'est PAR la cellule Débit sera en lecture seule avec une valeur fixe de 0.00 et le crédit sera rempli par l'utilisateur.

Après la fin de chaque ligne, le crédit et le débit seront calculés et si la ligne de crédit> débit est ajoutée, la ligne BY sera ajoutée jusqu'à crédit = débit. Maintenant, lorsque je calcule la dans la cellule modifiable, je dois utiliser EdittedFormattedValue sinon je dois utiliser Value.

decimal credit = 0; 
decimal debit = 0; 

foreach (DataGridViewRow row in dataGridViewReceipts.Rows) 
{ 
    if (row.Cells[2].Value != null) 
     credit += decimal.Parse(row.Cells[2].Value.ToString()); 
    else 
     credit += decimal.Parse(row.Cells[2].EditedFormattedValue.ToString()); 


    if (row.Cells[3].Value != null) 
     debit += decimal.Parse(row.Cells[3].Value.ToString()); 
    else 
     debit += decimal.Parse(row.Cells[3].EditedFormattedValue.ToString()); 
} 
labelCredit.Text = credit.ToString(); 
labelDebit.Text = debit.ToString(); 

Cela a fonctionné parfaitement. Mais quand il s'agit d'éditer une facture, je remplis tout de la base de données et laisse l'usage l'éditer.

dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnDirection"].Value = "BY"; 
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnParty"].Value = dr["PartyName"].ToString(); 
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnParty"].Tag = dr["PartyID"].ToString(); 
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnCredit"].Value = dr.GetDecimal(dr.GetOrdinal("Amount")); 
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnCredit"].ReadOnly = false; 
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnDebit"].Value = "0.00"; 
dataGridViewReceipts.Rows[dataGridViewReceipts.Rows.Count - 1].Cells["ColumnDebit"].ReadOnly = true; 

Maintenant, quand j'utilise le code qui calcule crédit et de débit, le Cell.Value ne devient jamais nulle, donc toujours la valeur est utilisée (la nouvelle valeur éditée apparaît dans EdittedFormattedValue) produisant des résultats erronés.

Veuillez suggérer une solution appropriée.

+0

J'ai complètement mal compris votre question alors ... s'il vous plaît fournir un exemple plus clair de ce qu'est le problème. – alexD

Répondre

1

Si je comprends bien la question correctement, vous devez toujours valider les modifications de l'utilisateur et toujours utiliser Valeur au lieu de EditedFormatedValue dans le calcul de votre crédit et de débit.

EditedFormatedValue est la valeur actuelle, au format de la cellule, que la cellule est en mode édition et la valeur n'a pas été commise.

+0

Y at-il un moyen de valider la cellule automatiquement après qu'elle a été modifiée? –

+1

Essayez l'événement modifié de valeur de cellule [commit] (http://msdn.microsoft.com/fr-fr/library/system.windows.forms.datagridview.commitedit.aspx) ou définissez cell.value = cell.editedFormattedText. – Reniuz

Questions connexes