質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

4440閲覧

CSVデータへの書き込み結果とデータグリッドビューへの読み込み結果が合わない(空になる)

P5_USER

総合スコア73

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2018/01/13 08:23

編集2018/01/15 01:40

###質問
お世話になります。

読み込みボタンクリックイベントで,CSVファイルを開いて内容を読み込んでデータグリッドビューに表示
書き込みボタンクリックで,CSVファイルを開いてデータグリッドビューに内容を書き込む
というだけの行為なのですが,
2回目の読み込みボタンクリックで表示されるデータグリッドビューが空になってます(CSVファイルも空になっていました)。

同じファイルパスを指定しているにもかかわらず,データがなくなってしまうのはどこが悪いのでしょうか。

###実現したいこと
実行時,2回目の読み込みボタンクリック(読み込みボタン1回目→書き込みボタン→読み込みボタン2回目)
でCSVの中身が空になってしまう事態を避けたい。

ここが怪しいのかなと思うのですが,対処方法がわからないです。
イメージ説明
###該当のデザイナー
[編集]ボタン(Name:button_Collection)をクリックすると
Read_And_ViewFileメソッドを呼び出し,
コレクションルーム(Name:tabPage2)に遷移(表示)します。
イメージ説明
[決定]ボタン(Name:button_Return)をクリックすると
SaveFileメソッドを呼び出し,
選択ルーム(Name:tabPage1)に遷移(表示)します。
イメージ説明
###該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.IO; 11using Microsoft.VisualBasic.FileIO; 12using CsvHelper; 13 14namespace KMAP 15{ 16 public partial class Form1 : Form 17 { 18 TabPageManager _tabPageManager = null; 19 20 21 //ファイルパス作成用変数 22 public string userName; 23 public string cDrive_To_UserName; 24 public string cDrive_To_Desktop; 25 public string cDrive_To_Conversion_Folder; 26 public string cDrive_To_AirPortList_Folder; 27 public string ListName; 28 29 public Form1() 30 { 31 InitializeComponent(); 32 } 33 34 public void Form1_Load(object sender, EventArgs e) 35 { 36 MakePathAndFile(); 37 38 //タブページマネージャーを作成する。 39 _tabPageManager = new TabPageManager(tabControl1); 40 41 _tabPageManager.ChangeTabPageVisible(0, true); 42 _tabPageManager.ChangeTabPageVisible(1, false); 43 _tabPageManager.ChangeTabPageVisible(2, false); 44 } 45 46 /// <summary> 47 /// ファイルパスを作成したり,フォルダを作成したりする。 48 /// </summary> 49 public void MakePathAndFile() 50 { 51 //ユーザ名を取得する。 52 userName = Environment.UserName; 53 54 //Cドライブからデスクトップまでのディレクトリパスを生成する。 55 cDrive_To_UserName = Path.Combine(@"C:\Users", userName); 56 cDrive_To_Desktop = Path.Combine(cDrive_To_UserName, @"Desktop\"); 57 58 //デスクトップに出現位置変換済フォルダを作成する。 59 cDrive_To_Conversion_Folder = Path.Combine(cDrive_To_Desktop + @"出現位置変換済フォルダ"); 60 DirectoryInfo directoryInfo1; 61 directoryInfo1 = Directory.CreateDirectory(cDrive_To_Conversion_Folder); 62 63 //出現位置変換済フォルダに空港情報フォルダ(隠しフォルダ)を作成する。 64 cDrive_To_AirPortList_Folder = Path.Combine(cDrive_To_Conversion_Folder + @"\空港情報フォルダ"); 65 DirectoryInfo directoryInfo2; 66 directoryInfo2 = Directory.CreateDirectory(cDrive_To_AirPortList_Folder); 67 directoryInfo2.Attributes |= FileAttributes.Hidden; 68 69 //機体モデル出現位置リスト.csvのフルパスを作成する。 70 ListName = Path.Combine(cDrive_To_AirPortList_Folder, "機体モデル出現位置リスト" + ".csv"); 71 72 } 73 74 /// <summary> 75 /// CSVのファイルパスを指定して読み込む 76 /// </summary> 77 /// <param name="filePath"></param> 78 private void Read_And_ViewFile(string filePath) 79 { 80 // CSVファイルオープン 81 using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "csv|*.csv", ValidateNames = true }) 82 { 83 if (ofd.ShowDialog() == DialogResult.OK) 84 { 85 var sr = new StreamReader(new FileStream(ofd.FileName, FileMode.Open)); 86 var csv = new CsvReader(sr); 87 airPortDataClassBindingSource.DataSource = csv.GetRecords<AirPortDataClass>().ToList(); 88 sr.Close(); 89 } 90 } 91 } 92 93 /// <summary> 94 /// CSVのファイルパスを指定して保存する 95 /// </summary> 96 /// <param name="filePath">CSVのファイルパスを指定します</param> 97 private void SaveFile(string filePath) 98 { 99 using (var sw = new StreamWriter(filePath, false, Encoding.GetEncoding("UTF-8"))) 100 { 101 var writer = new CsvWriter(sw); 102 103 foreach (AirPortDataClass AirPortData in airPortDataClassBindingSource.DataSource as IEnumerable<AirPortDataClass>) 104 { 105 writer.WriteHeader(typeof(AirPortDataClass)); 106 107 writer.WriteRecord(AirPortData); 108 } 109 } 110 } 111 112 /// <summary> 113 /// KMAPのDATファイルをstringで読み込みます。 114 /// </summary> 115 /// <param name="text"></param> 116 /// <param name="path"></param> 117 public void Load_Dat_File(TextBox text, String path) 118 { 119 StreamReader reader = new StreamReader(path); 120 textBox_DAT_File.Text = path; 121 } 122 123 //DATファイルを選択する 124 private void button_DAT_Choice_Click(object sender, EventArgs e) 125 { 126 using (OpenFileDialog ret = new OpenFileDialog() { Filter = "dat形式(*.dat)|*.dat|全てのファイル(*.*)|*.*" }) 127 { 128 if (ret.ShowDialog() == DialogResult.Cancel) 129 { 130 return; 131 } 132 Load_Dat_File(textBox_DAT_File, ret.FileName); 133 } 134 } 135 136 //次のタブページに移動する 137 private void button_Next1_Click(object sender, EventArgs e) 138 { 139 if (this.textBox_DAT_File.Text == "未登録") 140 { 141 MessageBox.Show("DATファイルを選択してください。", "注意"); 142 return; 143 } 144 _tabPageManager.ChangeTabPageVisible(0, false); 145 _tabPageManager.ChangeTabPageVisible(1, false); 146 _tabPageManager.ChangeTabPageVisible(2, true); 147 } 148 149 //コレクションルームに入る 150 private void button_Collection_Click(object sender, EventArgs e) 151 { 152 153 //CSVファイルを読み込んでデータグリッドビューに表示 154 Read_And_ViewFile(ListName); 155 156 _tabPageManager.ChangeTabPageVisible(0, false); 157 _tabPageManager.ChangeTabPageVisible(1, true); 158 _tabPageManager.ChangeTabPageVisible(2, false); 159 } 160 161 //コレクションルームから出る 162 private void button_Return_Click(object sender, EventArgs e) 163 { 164 //CSVファイルを開いてデータグリッドビューのデータを格納 165 SaveFile(ListName); 166 167 //メッセージボックス表示 168 MessageBox.Show("機体モデル出現位置リスト.csvを更新しました。", "情報"); 169 170 //タブ表示を変える 171 _tabPageManager.ChangeTabPageVisible(0, true); 172 _tabPageManager.ChangeTabPageVisible(1, false); 173 _tabPageManager.ChangeTabPageVisible(2, false); 174 } 175 176 //最初のタブページに戻る 177 private void button_Back_TabPage_Click(object sender, EventArgs e) 178 { 179 _tabPageManager.ChangeTabPageVisible(0, true); 180 _tabPageManager.ChangeTabPageVisible(1, false); 181 _tabPageManager.ChangeTabPageVisible(2, false); 182 } 183 184 //アプリケーションを終了する 185 private void button_End_Click(object sender, EventArgs e) 186 { 187 this.Close(); 188 } 189 } 190}

以下は別クラスで作成

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace KMAP 8{ 9 public class AirPortDataClass 10 { 11 public string ICAO_Code { get; set; } 12 public string Name { get; set; } 13 public string Latitude { get; set; } 14 public string Longitude { get; set; } 15 public string Azimuth { get; set; } 16 } 17}

###補足情報(言語/FW/ツール等のバージョンなど)
言語はC#
開発環境はVisualStudio2017
.NET Framework Version 4.7.02556
です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/01/13 13:43

デザイナーとコードがどうつながっているのかわからないのでわかりません。「読み込みボタン」とやらを押すとどうなるのかもわかりません。結局どのメソッドがどの順序で呼ばれるのかの説明を質問に追記してください。
P5_USER

2018/01/13 14:31

Zuishinさん 更新しました。該当のデザイナーが追加項目になります。
guest

回答2

0

ベストアンサー

CsvHelper

When you are done writing the row, don't forget to call NextRecord to flush the data and write the line ending.

WriteHeaderやWriteRecordの後には必ずNextRecordを呼べと書いてあります。

投稿2018/01/16 06:01

sh_akira

総合スコア380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

P5_USER

2018/01/16 06:05

sh_akiraさん ありがとうございます。 無事,読み込みをすることが出来ました。
guest

0

foreach (AirPortDataClass AirPortData in airPortDataClassBindingSource.DataSource as IEnumerable<AirPortDataClass>) { writer.WriteHeader(typeof(AirPortDataClass)); writer.WriteRecord(AirPortData); }

ここおかしくないですか?

投稿2018/01/13 17:25

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

P5_USER

2018/01/14 01:15

dojikkoさん ありがとうございます。 指摘の行はwriter.WriteRecord(AirPortData);のことでしょうか。
dojikko

2018/01/14 10:23

WriteHeaderの方です これだとループが回るたびにヘッダーを書くことになりませんか?
P5_USER

2018/01/14 10:51

writer.WriteHeader(typeof(AirPortDataClass));をforeachの一つ上の行に変更しましたが, CSVの書き込みは為されていませんでした。 しかし,確かに,ご指摘の通りの行動をすると予想されるので,書き込み結果が明らかになってからもう一度確かめようと思っています。
dojikko

2018/01/14 15:42

もうされていると思いますが、private void SaveFile(string filePath)の行にブレイクポイントを設定して、デバック実行してみて正しく値が渡されて実行されているか確認してみてはどうでしょう
P5_USER

2018/01/15 01:20

一つ気になるところがありました。 SaveFileメソッド内のforeachの.DataSourceの中を見てみると, 4つ枠を構えている配列の1番目だけにデータがありました。 その時の画像を質問文に追加しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問