いつもお世話になっています。
以下の参考にしたものに書いてあります動画を元に写経をしてアレンジしました。
実行すると,foreachの行でエラーを吐かれてしまって右往左往の状態です。
何故,このような状態が起きているのでしょうか。
どのコードを変更あるいは追加するのが一番良いのでしょうか。
ちなみにSaveFile()はボタンクリックイベントで実行されるようになっています。
###参考にしたもの
C# Tutorial - Read & Write csv file | FoxLearn
写経元は以下のようになっています。
Studentクラスはデータグリッドビューのデータソースの選択から指定しています。
using CsvHelper; 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 ReadWriteCSV { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnWrite_Click(object sender, EventArgs e) { using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "CSV|*.csv", ValidateNames = true }) { if (sfd.ShowDialog()==DialogResult.OK) { using (var sw = new StreamWriter(sfd.FileName)) { var writer = new CsvWriter(sw); writer.WriteHeader(typeof(Student)); foreach(Student s in studentBindingSource.DataSource as List<Student>) { writer.WriteRecord(s); } } MessageBox.Show("Your data has been successfully saved.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } private void Form1_Load(object sender, EventArgs e) { studentBindingSource.DataSource = new List<Student>(); } private void btnRead_Click(object sender, EventArgs e) { using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "CSV|*.csv", ValidateNames = true }) { if (ofd.ShowDialog()==DialogResult.OK) { var sr = new StreamReader(new FileStream(ofd.FileName, FileMode.Open)); var csv = new CsvReader(sr); //studentBindingSource.DataSource = csv.GetRecord<Student>().ToString(); studentBindingSource.DataSource = csv.GetRecords<Student>(); } } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ReadWriteCSV { public class Student { public string StudentID { get; set; } public string StudentName { get; set; } public string Email { get; set; } public string Phone { get; set; } } }
###発生している問題・エラーメッセージ
foreachの行で発生。
System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。' (... as System.Collections.Generic.List<KMAP.AirPortDataClass>) が null を返しました。
C#
1 /// <summary> 2 /// CSVのファイルパスを指定して保存する 3 /// </summary> 4 /// <param name="filePath">CSVのファイルパスを指定します</param> 5 private void SaveFile(string filePath) 6 { 7 using (var sw = new StreamWriter(filePath, false, Encoding.GetEncoding("SHIFT-JIS"))) 8 { 9 var writer = new CsvWriter(sw); 10 writer.WriteHeader(typeof(AirPortDataClass)); 11 foreach (AirPortDataClass AirPortData in airPortDataClassBindingSource.DataSource as List<AirPortDataClass>) 12 { 13 writer.WriteRecord(AirPortData); 14 } 15 sw.Close(); 16 } 17 } 18
以下のクラスは,ソリューションファイル右クリック→追加→新しい項目で作成しました。
C#
1 public class AirPortDataClass 2 { 3 public string ICAO_Code { get; set; } 4 public string Name { get; set; } 5 public string Latitude { get; set; } 6 public string Longitude { get; set; } 7 public string Azimuth { get; set; } 8 } 9
###補足情報(言語/FW/ツール等のバージョンなど)
言語はC#
開発環境はVisualStudio2017
.NET Framework Version 4.7.02556
です
回答2件
あなたの回答
tips
プレビュー