2013-06-26 4 views
2

В строке, которая включает dgdMain.DataSource = dt;, я получаю «Исключение NullReferenceException было необработанным». Я попытался найти решение, и я уверен, что это просто, но я явно не понимаю его. Спасибо за любой вклад.«Исключение NullReferenceException было необработанным» при назначении DataTable DataGridView

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Data.OleDb; 
using System.Diagnostics; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Dashboard 
{ 
    public partial class frmMain : Form 
    { 
     public frmMain() 
     { 
      BindingSource bindingSource = new BindingSource(); 
      DataTable dt = Program.GetDataTableFromCSV("../../res/sampledata.csv"); 
      dgdMain.DataSource = dt; 

      InitializeComponent(); 

     } 
    } 
} 

... и вот GetDataTableFromCSV():

public static DataTable GetDataTableFromCSV(string path) 
{ 
    DataTable dataTable = new DataTable(); 
    String[] values; 

    values = File.ReadAllLines(path); 

    string[] csvRows = System.IO.File.ReadAllLines(path); 
    string[] headers = csvRows[0].Split(','); 

    // Adding columns name 
    foreach (var item in headers) 
     dataTable.Columns.Add(new DataColumn(item)); 

    string[] fields = null; 

    foreach (string csvRow in csvRows) 
    { 
     //Debug.Write(csvRow+"\r\n"); 
     fields = csvRow.Split(','); 
     DataRow row = dataTable.NewRow(); 
     row.ItemArray = fields; 
     dataTable.Rows.Add(row); 
    } 

    return dataTable; 
} 
+0

Почему вы создаете BindingSource в конструкторе, который вы никогда не используете? И почему вы выполняете 'File.ReadAllLines (путь)' дважды в GetDataTable ..., ('values' также никогда не используется)? –

+5

** Сначала ** вызовите InitializeComponent() и **, затем ** вы можете использовать dgdMain. –

+1

Кроме того, файлы CSV могут иметь запятые внутри фактических значений и, таким образом, разделение на '', ''не самая лучшая идея. Обратитесь к http://stackoverflow.com/questions/2081418/parsing-csv-files-in-c-sharp – chancea

ответ

3

InializeComponent должен быть сверху. Это должно быть так:

public frmMain() 
    { 
     InitializeComponent(); 

     BindingSource bindingSource = new BindingSource(); 
     DataTable dt = Program.GetDataTableFromCSV("../../res/sampledata.csv"); 
     dgdMain.DataSource = dt; 
    } 
+0

Кто такой downvoter? Почему downvote? –

+0

Ничего себе, это было глупо от меня. Fargin 'C#! – Gabriel

1

dgdMain является нулевым, и именно поэтому он бросает NullReferenceException.

Вы должны использовать его после звонка InitializeComponent.

Кроме того, ознакомьтесь с этой ссылкой. What is a NullReferenceException, and how do I fix it?