2016-04-13 2 views
1

Я пытаюсь преобразовать мой DataGridView dgvInput от Form1 к DataTable в другом классе Queries в рамках подготовки к SqlBulkCopy. Я передаю dgvInput методу SaveAll в моем классе Queries с параметром DataGridView dgv.Преобразование несвязанного DataGridView в DataTable

Form1:

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

Класс:

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 
    } 
} 

Я получаю NullReferenceException на линии >>.
Сообщение об ошибке: Ссылка на объект не установлена ​​в экземпляр объекта. Я пробовал установить New на dgv. Тем не менее, я все еще получаю исключение. Из того, что я исследовал, петли Nested для СЛЕДУЕТ делать правильную работу.

Как я могу это решить?

+1

либо 'dr.Cells [i]', либо 'dr.Cells [i] .Value' является' null'. Вероятно, это 'dr.Cells [i]'. Использовать нулевой условный оператор. – Ian

+0

Спасибо! 'dr.Cells [i] .Value' является' null'. В частности, первая строка, которую он генерирует, равна null. Могу ли я как-то удалить эту нулевую строку? – Hexxed

+0

@Ian NVM. Я только узнал, почему его нулевой. моя последняя строка пуста. Просто установите 'AllowUserToAddRows = false'. Спасибо за помощь. Пожалуйста, напишите свой ответ ниже. Поэтому я мог бы принять это. – Hexxed

ответ

1

Проблема заключается в том, что ваш dr.Cells[i].Value равен null, и это вызвано пустой последней строкой из-за опции AllowUserToAddRows = true, как вы выясните позже. Чтобы решить эту проблему, вы может положить AllowUserToAddRows = false как что вы сделали.

Но еще лучше, чтобы проверить, если dr.Cells[i].Value не null перед обработкой его, чтобы сделать его более устойчивым по отношению к null значения ячейки, где оно может быть найдено:

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(); } 
} 

и использовать continue игнорировать null ячейку. Используйте AllowUserToAddRows = false, только если вы действительно это понимаете; то есть для предотвращения добавления пользователем строк, а не для защиты от значения ячейки null.

Смежные вопросы