2016-04-13 12 views
1

Ich versuche, meine Datagridview dgvInput von Form1 zu einem DataTable in einer anderen Klasse Queries in Vorbereitung auf SqlBulkCopy zu konvertieren. Ich gehe dgvInput ein Verfahren SaveAll in meiner Klasse Queries mit einem Parameter DataGridView dgv.Konvertieren von ungebundenen Datagridview zu einer Datatable

Form1:

public void convert2DT(DataGridView dgv) 
{ 
    Queries qry = new Queries(); 
    qry.SaveAll(dgvInput); 
} 

Klasse:

class Queries { 

public void SaveAll(DataGridView dgv) 
    { 
     foreach (DataGridViewRow dr in dgv.Rows) 
     { 
      //Create table and insert into cell value. 
      DataRow dataRow = dt.NewRow(); 
      for (int i = 0; i < noOfColumns; i++) 
      { 
       if (i == 0) 
      >> { dataRow[i] = DateTime.Parse(dr.Cells[i].Value.ToString()); } 
       else if (i == 7) 
       { dataRow[i] = int.Parse(dr.Cells[i].Value.ToString()); } 
       else 
       { dataRow[i] = dr.Cells[i].Value.ToString(); } 
      } 
      dt.Rows.Add(dataRow); 
     } 
    //SqlBulkCopy Codes 
    } 
} 

Ich erhalte Nullreferenceexception on line >>.
Fehlermeldung: Objektverweis nicht auf eine Instanz eines Objekts festgelegt. Ich habe versucht, New auf dgv zu setzen. Allerdings bekomme ich immer noch eine Ausnahme. Nach was ich recherchiert habe, sollten die Nested for Loops den Job richtig machen.

Wie kann ich dieses Problem lösen?

+1

entweder 'dr.Cells [i]' oder 'dr.Cells [i] .Value' ist' null'. Wahrscheinlich ist es "dr.Cells [i]". Verwenden Sie den bedingten Operator null. – Ian

+0

Danke! 'dr.Cells [i] .Value 'ist' null'. Speziell die erste Zeile, die es generiert, ist null. Kann ich diese Nullzeile irgendwie löschen? – Hexxed

+0

@Ian NVM. Ich habe gerade herausgefunden, warum es null ist. Meine letzte Zeile ist leer. Setzen Sie einfach 'AllowUserToAddRows = false'. Danke für die Hilfe. Bitte posten Sie Ihre Antwort unten. Also konnte ich es akzeptieren. – Hexxed

Antwort

1

Das Problem ist, weil Ihre dr.Cells[i].Value ist null und das wird durch die leere letzte Zeile aufgrund der Option AllowUserToAddRows = true verursacht, wie Sie später herausfinden. Um es zu lösen, können Sie setzen AllowUserToAddRows = false als was Sie getan haben.

Aber noch besser zu überprüfen, ob dr.Cells[i].Value nicht null vor der Verarbeitung ist es robust gegenüber null Zellenwert mehr zu machen, wo es zu finden:

for (int i = 0; i < noOfColumns; i++) 
{ 
    if (dr.Cells[i].Value == null) 
     continue; //don't process 
    if (i == 0) 
    { dataRow[i] = DateTime.Parse(dr.Cells[i].Value.ToString()); } 
    else if (i == 7) 
    { dataRow[i] = int.Parse(dr.Cells[i].Value.ToString()); } 
    else 
    { dataRow[i] = dr.Cells[i].Value.ToString(); } 
} 

Und continue verwenden, um die null Zelle zu ignorieren. Verwenden Sie AllowUserToAddRows = false nur, wenn Sie es wirklich meinen; Das heißt, um zu verhindern, dass Benutzer Zeilen hinzufügen, um nicht gegen den Wert null der Zelle zu schützen.

Verwandte Themen