2012-03-07 83 views
0

嗨我有一個程序來解析CSV並將其填充到DataGridView。C#從其他類返回填充DataGridView

當我做這樣它的偉大工程:

 openFileDialog1.Filter = "CSV Files(*.csv)|*.csv"; 
     openFileDialog1.FilterIndex = 1; 
     openFileDialog1.RestoreDirectory = true; 

     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      txtCsvSource.Text = openFileDialog1.FileName; 
      Encoding iso = Encoding.GetEncoding("ISO-8859-1"); 
      using (CachedCsvReader csv = new CachedCsvReader(new StreamReader(txtCsvSource.Text, iso), true)) 
      { 
       csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty; 
       dataGridView1.DataSource = csv; 
      } 
     } 

但當Im做這樣的:

 openFileDialog1.Filter = "CSV Files(*.csv)|*.csv"; 
     openFileDialog1.FilterIndex = 1; 
     openFileDialog1.RestoreDirectory = true; 

     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      txtCsvSource.Text = openFileDialog1.FileName; 
      dataGridView1.DataSource = QrFunctions.parsecsv(txtCsvSource.Text); 
      dataGridView1.Update(); 
     } 

與QrFunctions.parsecsv是這樣的:

public CachedCsvReader parsecsv(string csvpath) 
    { 
     Encoding iso = Encoding.GetEncoding("ISO-8859-1"); 
     using (CachedCsvReader csv = new CachedCsvReader(new StreamReader(csvpath, iso), true)) 
     { 
      csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty; 
      return csv; 
     } 
    } 

DataGridView爲空...爲什麼?我根本不知道:-(我只是想使用此功能在另一類解析,所以我創建的類QrFunctions。

回答

1

試試這個。

public CachedCsvReader parsecsv(string csvpath) 
    { 
     Encoding iso = Encoding.GetEncoding("ISO-8859-1"); 
     CachedCsvReader csv = new CachedCsvReader(new StreamReader(csvpath, iso), true) 
     { 
      csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty; 
      return csv; 
     } 
    } 

請記住處置對象自己,因爲我已經刪除了using語句或實現IDisposable pattern

感謝@MartiniMoe了建設性的意見。

+0

這並沒有改變任何東西:-( 我不知道爲什麼它應該工作,你只是複製CachedCsvReader並返回第二個 – MartiniMoe 2012-03-07 08:59:07

+0

@MartiniMoe - 這個答案看起來對於我來說也是正確的,因爲在你離開你的函數時使用了你的csv閱讀器。你能讓我們知道CachedCsvReader類來自哪裏,所以我們可以複製代碼嗎? – 2012-03-07 09:12:36

+0

@MartiniMoe在你的第一個代碼示例中,你不必使用dataGridView1.Update();將dataGridView1綁定到CachedCsvReader時,爲什麼在第二個代碼示例中使用它?還可以使用調試器來檢查,當您獲取任何數據時在第二個代碼示例中設置數據源屬性。 – alykhalid 2012-03-07 09:21:23

0

Alykhalid的回答幾乎是正確的,除了它看起來像01的Dispose方法在StreamReader上致電Dispose,致電。

所有using語句是,是下面的代碼語法糖:

try 
{ 
    var yourObject = new SomeIDisposable(); 
    // Some code using yourObject 
} 
finally 
{ 
    yourObject.Dispose(); 
} 

所以周圍使用CachedCsvReader呼籲讀者,這是我猜的Dispose()方法看起來是這樣的:

void Dispose() 
{ 
    streamReader.Dispose(); 
} 

所以一旦你在使用外塊,配置已經呼籲StreamReader,甚至當你的CSV讀者參考複製到一個對象使用,你流本身外已關閉,以便您的DataGridView收不到任何數據。

正如您發現的,可以通過刪除使用語句來修復此問題,但這有缺點,您現在正在未關閉您的流,這可能會產生一些不良影響。

要遵循最安全的做法,你應該:

  • 讓QrFunctions實現IDisposable,所以你可以在使用using語句(其實只是讓你回到開始的地方)
  • 呼叫.Dispose()您返回的CachedCsvReader。
  • 將使用語句放回到您的幫助函數中,但讀取使用內部的流 - 希望CSV讀取器可以被迫直接讀取並返回某種列的csv行。然後你只需返回列表而不是CSV閱讀器。您的代碼看起來是這樣的:

    public List<CSVRows> parsecsv(string csvpath) 
    { 
        Encoding iso = Encoding.GetEncoding("ISO-8859-1");      
        using (CachedCsvReader csv = new CachedCsvReader(new StreamReader(csvpath, iso), true))      
        {      
         csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty;      
         // I have no idea what this method is but if it exists it could be called ToList or Read  
         return csv.ToList<CSVRows>();      
        } 
    }