2017-06-13 8 views
2

CSVをインポートして、DataGridViewでデータを表示しようとしています。
ここまでは、これまでの動作を理解しているコードと説明です。
私が理解できない場合は、私に修正してください。olehDBconnectを使用しないでDataGridview C#でCsvデータを出力

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace test2 
{ 
    public partial class Form1 : Form 
    { 
     //Open the choose GUI to choose the file that we want to import 
     OpenFileDialog openFile = new OpenFileDialog(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 


     private void Button1_Click(object sender, EventArgs e) 
     { 
      //if open successfully, then apply streamReader to it 
      if (openFile.ShowDialog() == DialogResult.OK) 
      { 
       StreamReader sr = new StreamReader(openFile.FileName); 
       //read the data in the file by using readLine 
       var rl = sr.ReadLine(); 

       // If the rl is not null, then print (is it correct?).... 
       if(rl != null) 
       { 
        ///code to print data 
       } 
      } 
     } 

     //filter out the csv file. 
     private void Form1_Load_1(object sender, EventArgs e) 
     { 
      openFile.Filter = "CSV|*.csv"; 
     } 

    } 
} 

今、データを印刷しようとしています。
データを印刷するためにDataGridView.DataSourceを使用する必要があることを知っています(間違っている場合は修正してください)。ただし、適用方法はわかりません。
私の説明は本当ですか、それとも何か追加していますか?
--beginner。

サンプル画像。 enter image description here

+0

一つの方法は、データテーブルと列は、CSVファイルと内容が一致してグリッドへのDataTable割り当てる必要があります作成することです。 。 –

答えて

2

List(文字列など)を作成してDataSourceとして使用できます。 DataGridViewのx:の名前がdgvであると仮定します。

private void Button1_Click(object sender, EventArgs e) 
{ 
    //if open successfully, then apply streamReader to it 
    if (openFile.ShowDialog() == DialogResult.OK) 
    { 
     List<string[]> rows = System.IO.File.ReadAllLines(openFile.FileName).Select(x => x.Split(',')).ToList(); 
     System.Data.DataTable dt = new System.Data.DataTable(); 
     List<string> headerNames = rows[0].ToList(); 
     foreach (var header in headerNames) 
     { 
      dt.Columns.Add(headers); 
     } 
     foreach (var x in rows.Skip(1)) 
     { 
      if (x.SequenceEqual(headerNames)) //linq to check if 2 lists are have the same elements (perfect for strings) 
       continue;  //skip the row with repeated headers 
      dt.Rows.Add(x); 
     } 
     dgv.DataSource = dt; 
    } 
} 

using System.Linq;を覚えておいてください。

不明な点があるかどうか尋ねます。 2番目のforeachループにさらにチェックを加えることができます(たとえば、行のすべての項目が空であるかどうかを確認してください)。

私の答えはに基づいています:2つのリストの平等をチェックする最良の方法についてFaster way of reading csv to grid

Check if two lists are equal

+0

それは印刷されます| | 、私は何かが間違っていると思います | 340 | – ccs

+0

編集されたコードを試してみてください。これはすべての行を取得する必要があります。しかし、私はあなたのcsvの形式を知らないので、このコードでは1つの列しかないと仮定しています。列数や列名を指定すると、自分の答えを改善することができます。 –

+0

列と行の数が異なるcsvファイルがある場合、どうすればよいですか?私はそれをすべてのCsvファイルに "フレキシブル"にしたいと思います。 – ccs

関連する問題