2010-11-04 3 views
0

J'ai remarqué que DatagridviewtextBoxColumn n'est pas converti en Decimal. Je l'ai démontré de deux manières qui sont les suivantes.Problème de diffusion sur DatagridViewtextBoxColumn

  1. DataTable: -

    DataTable dt = new DataTable(); 
    dt.Columns.Add("carats"); 
    dt.Columns.Add("rate"); 
    dt.Columns.Add("amount"); 
    dataGridView1.DataSource = dt; 
    

Il fonctionne très bien avec le code de coulée Après

private void dataGridView1_CellEndEdit(object sender,DataGridViewCellEventArgs e) 
{ 
    int b = dataGridView1.CurrentCell.RowIndex; 
    if (
     dataGridView1[0, b].Value != DBNull.Value && 
     dataGridView1[1, b].Value != DBNull.Value 
    ) 
    { 
    dataGridView1[2, b].Value = Convert.ToDecimal(dataGridView1[0, b].Value.ToString())   
    * Convert.ToDecimal(dataGridView1[1, b].Value.ToString()); 

    } 
} 

Mais mon observation principale sur DataGridViewTextBoxColumn il est notcasting ce pourquoi ?.

2. DataGridViewTextBoxColumn: -

DataGridViewTextBoxColumn cts = new DataGridViewTextBoxColumn();    
dataGridView1.Columns.Insert(0, cts); 
DataGridViewTextBoxColumn rt = new DataGridViewTextBoxColumn(); 
dataGridView1.Columns.Insert(1, rt); 
DataGridViewTextBoxColumn amt = new DataGridViewTextBoxColumn(); 
dataGridView1.Columns.Insert(2, amt); 

Il est Erreur Throw Comme « Exception NullReference était Unhandle », « référence d'objet fixe pas une instance sur un objet « avec code suivant:

private void dataGridView1_CellEndEdit(object sender,DataGridViewCellEventArgs e) 
{ 
    int b = dataGridView1.CurrentCell.RowIndex; 
    if (
     dataGridView1[0, b].Value != DBNull.Value && 
     dataGridView1[1, b].Value != DBNull.Value 
    ) 
    { 
    dataGridView1[2, b].Value = Convert.ToDecimal(dataGridView1[0, b].Value.ToString())   
    * Convert.ToDecimal(dataGridView1[1, b].Value.ToString()); 

    } 
} 
Je veux juste savoir la raison derrière cela. Et résoudre le problème de diffusion avec DatagridviewtextBoxColumn

Répondre

1

J'ai utilisé seulement 'null' pour vérifier les cellules dataagridView, pas DBNull. Avez-vous essayé avec ça?

Edit: après avoir lu un peu je l'ai trouvé this (VB.NET) qui dit que

Si la grille est liée à un DataTable alors les cellules « vides » contiennent DBNull.Value. Si la grille est liée à autre chose ou n'est pas liée du tout, alors les cellules "vides" contiendront Nothing

donc vous devriez probablement vérifier null.

+0

@Rox, oui vous avez raison mais pourquoi ça marche avec datatable et pourquoi pas avec datagridviewcomboboxcolumn? – mahesh

+0

Cela ne marche-t-il pas après avoir changé en null dans datagridview? DBNull est utilisé uniquement pour la liaison DataTable - Je ne sais pas pourquoi c'est comme ça, mais peut-être vous pouvez en trouver plus sur msdn – Rox

+0

@mahesh: Dans le premier exemple vous avez lié 'DataGridView' à un' DataTable', donc vide les cellules ont une valeur de 'DBNull' (sur laquelle vous pouvez appeler' ToString' sans 'NullReferenceException') alors que dans le deuxième exemple 'DataGridView' est non lié, ce que Rox signale est que les cellules vides contiennent' null'. Si vous appelez 'null.ToString()', vous obtenez une exception 'NullReferenceException'. Donc vous devez changer '! = DBNull.Value' en'! = Null'. –