2017-08-29 50 views
0

一切都在我的項目大多是動態的,我有,試圖創建多個datagridviews動態的NullReferenceException發現datagridview的

與我的設置,我在這條線 dgv.DataSource = ds.Tables[index.ToString()];

伊夫試圖得到一個NullReferenceError

目前的時候有點問題幾種不同的方法,但就我所知,我不能似乎發現了什麼錯我的代碼這應該是完美的工作

所有相關的代碼如下

//Create a new window 
private void NewWindow() { 
      TabPage tb = new TabPage(); 
      DataGridView dgv = new DataGridView(); 
      DataTable dt = new DataTable(); 

      tb.Text = "New.."; 
      dgv.Dock = DockStyle.Fill; 

      tb.Controls.Add(dgv); 
      tabControl1.TabPages.Add(tb); 
} 

//bind 
DataGridView dgv = tabControl1.SelectedTab.Controls.OfType<DataGridView>() as DataGridView; 
dgv.DataSource = ds.Tables[index.ToString()]; 

編輯:這裏所有的所有相關函數和變量

DataSet ds = new DataSet(); 

     string path = ""; 

     bool _exiting = false; 

     private void openToolStripMenuItem_Click(object sender, EventArgs e) { 
      Browse(); 
     } 

private void NewWindow() { 
      TabPage tb = new TabPage(); 
      DataGridView dgv = new DataGridView(); 
      DataTable dt = new DataTable(); 

      tb.Text = "New.."; 
      dgv.Dock = DockStyle.Fill; 

      tb.Controls.Add(dgv); 
      tabControl1.TabPages.Add(tb); 
     } 

     private void OnColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { 
      int index = tabControl1.SelectedIndex; 
      EditHeader eh = new EditHeader(this.UpdateHeader); 
      eh.TextBox1.Text = ds.Tables[index.ToString()].Columns[e.ColumnIndex].ToString(); 
      eh.TextBox2.Text = e.ColumnIndex.ToString(); 
      eh.Show(); 
     } 

     private void UpdateHeader(string indexVal) { 
      string[] array = indexVal.Split(','); 
      int index = int.Parse(array[0]); 
      ds.Tables[index.ToString()].Columns[index].ColumnName = array[1]; 
      DisableSortMode(); 
     } 

     private void OpenCSVFile() { 
      using (TextFieldParser csvParser = new TextFieldParser(path)) { 
       csvParser.TextFieldType = FieldType.Delimited; 
       csvParser.SetDelimiters(","); 

       int index = tabControl1.SelectedIndex; 

       bool firstLine = true; 

       while (!csvParser.EndOfData) { 
        //proccessing 
        string[] fields = csvParser.ReadFields(); 

        if (firstLine) { 
         foreach (var val in fields) { 
          ds.Tables[index.ToString()].Columns.Add(val); 
         } 

         firstLine = false; 

         continue; 
        } 
        //get row data 
        ds.Tables[index.ToString()].Rows.Add(fields); 
       } 

       //bind 
       DataGridView dgv = tabPage1.Controls.OfType<DataGridView>() as DataGridView; 
       dgv.DataSource = ds.Tables[index.ToString()]; 
      } 
     } 

     private void Browse() { 
      OpenFileDialog csvSearch = new OpenFileDialog(); 
      csvSearch.Filter = "csv files (*.csv)|*.csv"; 
      csvSearch.FilterIndex = 1; 
      csvSearch.Multiselect = false; 

      if (csvSearch.ShowDialog() == DialogResult.OK) { 
       int index = tabControl1.SelectedIndex; 
       DataTable dt = ds.Tables.Add(index.ToString()); 
       path = csvSearch.FileName; 
       tabPage1.Text = csvSearch.FileName; 
       OpenCSVFile(); 
       DisableSortMode(); 
      } 
     } 
+0

'ds'是如何創建的? 'index'從哪裏來?你是否檢查過從控件返回的'dgv'不是null? – ainwood

+0

你的ds從哪裏來?它是一個數據集? –

+0

我更新了所有必要的代碼 – FlamingGenius

回答

1

的問題是這一行:

DataGridView dgv = tabPage1.Controls.OfType<DataGridView>() as DataGridView; 

在此背景下,OfType方法將返回IEnumerable<DataGridView>。當使用as將它轉換爲DataGridView時,結果將爲空,因爲它是錯誤的類型(類型和該類型的枚舉之間不存在隱式轉換)。順便說一下,大多數LINQ操作都是如此,這些操作通常適用於集合而非實例。

如果你想從集合中的單個實例,你可以使用:

DataGridView dgv = tabPage1.Controls.OfType<DataGridView>().Single(); 

...或可能:

DataGridView dgv = tabPage1.Controls.OfType<DataGridView>().First(); 

...如果你期望會有更多的不止一個DataGridView,你只需要其中的一個。

as部分不應該需要,因爲OfType<T>.Single()已經返回T(它隱含地調用Single<DataGridView>())。相同的First()

相關問題