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

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

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

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

5230閲覧

VB.NET CSVとデータテーブルについて2

jjjssskkk

総合スコア13

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/04/22 02:27

いつもお世話になっております。
現在課題としてVB.NETでCSVファイルを使った簡単な連絡先管理システムのようなものを作成しています。

機能としては、
1.既存のCSVファイルを読込み、リストボックスに番号、名前を一覧表示する
→あかさたな~でソートできるようにする
2.リストボックスの連絡先クリックでテキストボックスに詳細を表示
3.追加ボタンクリックで連絡先の新規追加
4.更新ボタンクリックで既存の連絡先の内容更新
5.削除ボタンクリックで既存の連絡先の削除
→いずれもCSVにデータを保存

を想定しています。

読込機能は、CSVからデータを読込みデータテーブルに格納してからリストボックス、テキストボックスに表示しています。
そこで、テキストボックスから編集した内容をデータテーブルに保存し、CSVを更新したいのですが、なかなかうまくいきません。
更新も削除も、編集したデータテーブルで丸ごと上書きするような方法をかんがえているのですが、現在のソースコードではなぜかCSVのデータが消えてしまいます。
データテーブルの使い方もイマイチ理解できていない初心者ですが、原因と解決策を教えていただけないでしょうか。

※CSVの内容は以下のようなかたちです。
0001,中山太朗,神奈川県,0000-00-0000,nakayama@aaa.com
0002,土田新太郎,新潟県,0120-00-1245,sdjnaidm@aaa.com
0003,中田三郎,富山県,0786-00-0000,fhsuw@aaa.com
0004,田中史郎,愛知県,0516-00-2652,aaaaa@aaa.com
0005,山田一郎,石川県,0585-58-5482,yamada@aaaa.com
0006,鈴木五郎,山梨県,0555-55-5555,suzuki@aaaa.com
0007,大田六郎,福岡県,5584-58-2541,oota@saaa.com

###該当のソースコード

'CSV処理クラス Public Class CsvCtl Private mTable As New DataTable Private mRow As DataRow ' CSVファイルの読み込み(起動時) Public Sub ReadData() 'フィールド(列)を追加 mTable.Columns.Add("number", Type.GetType("System.String")) mTable.Columns.Add("name", Type.GetType("System.String")) mTable.Columns.Add("address", Type.GetType("System.String")) mTable.Columns.Add("telephone", Type.GetType("System.String")) mTable.Columns.Add("mail", Type.GetType("System.String")) 'カンマ区切りテキストを読み込み、データテーブルに追加 Dim parser As TextFieldParser parser = My.Computer.FileSystem.OpenTextFieldParser("C:\adoresu.txt", ",") While Not parser.EndOfData mRow = mTable.NewRow mRow.ItemArray = parser.ReadFields mTable.Rows.Add(mRow) End While Call parser.Close() MainForm.DataGridView1.DataSource = mTable 'リストボックスに名前を表示 MainForm.ListBox1.DataSource = mTable MainForm.ListBox1.DisplayMember = "name" 'データテーブルの内容をテキストボックスに表示する MainForm.TextBox1.DataBindings.Add("Text", mTable, "number") MainForm.TextBox2.DataBindings.Add("Text", mTable, "name") MainForm.TextBox3.DataBindings.Add("Text", mTable, "address") MainForm.TextBox4.DataBindings.Add("Text", mTable, "telephone") MainForm.TextBox5.DataBindings.Add("Text", mTable, "mail") parser.Dispose() End Sub '編集内容の更新(ボタンクリック時) Public Sub Updatectl() Dim Writer As System.IO.StreamWriter = Nothing Try Writer = New System.IO.StreamWriter("C:\adoresu.txt", False, System.Text.Encoding.GetEncoding("Utf-8")) Dim colCount As Integer = mTable.Columns.Count Dim lastColIndex As Integer = colCount - 1 Dim i As Integer 'レコードを書き込む Dim row As DataRow For Each row In mTable.Rows For i = 0 To colCount - 1 'フィールドの取得 Dim field As String = row(i) 'フィールドを書き込む Writer.Write(field) 'カンマを書き込む If lastColIndex > i Then Writer.Write(","c) End If Next '改行する Writer.Write(vbCrLf) Next Catch ex As Exception MessageBox.Show(ex.Message, "Write") Finally '閉じる Writer.Flush() Writer.Close() MsgBox("データを更新しました") End Try End Sub End Class

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2012を使用しています。
そのほか必要な情報などございましたらご指摘お願いします。
たびたび似たような質問をするかもしれませんが、よろしくお願いいたします。

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

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

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

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

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

takito

2016/04/22 08:23

VB詳しくはないのですが気になる点として、CsvCtlクラスを使っている方のソースコードも追記できますか?
guest

回答3

0

C:\adoresu.txtに書き出そうとしているからじゃないですか?
別のパスに書き出してみては?

あと大丈夫だと思いますが、rowの中に値がちゃんと入っているかも確認した方がいいですね
デバッガで確認するのが面倒ならMessageBox.ShowやDebug.WriteLineとかを使って

投稿2016/04/23 06:26

編集2016/04/23 06:32
dojikko

総合スコア3939

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

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

0

ベストアンサー

実際に動作させての確認まではしていませんが、パッと見て問題はなさそうに思います。
・・・見落としはあるかもしれませんが(^-^;

書き込みの際、正しくループに入っているか(mTable.Rows.Countが1以上か)は確認されていますでしょうか?

クラス内の共通変数mTableからデータ取得しているので、単純に考えてReadDataする時のCsvCtlとUpdatectlする時のCsvCtlが別物だと0件更新になりそうです。

あと、Try~Catch~Finallyで、FinallyはCatch発生時にも処理されるはずです。
例外発生時はFlushしないほうが安全ではないかと思います。

投稿2016/04/22 09:32

jawa

総合スコア3013

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

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

jjjssskkk

2016/04/25 00:03

すみません、 更新のほうでデータの読み込みができていなかったようです。 mTable = DirectCast(MainForm.ListBox1.DataSource, DataTable) で解決しました。 ありがとうございます。
guest

0

すみません、 更新のほうでデータの読み込みができていなかったようです。
mTable = DirectCast(MainForm.ListBox1.DataSource, DataTable)

ご回答いただきありがとうございました。

投稿2016/04/24 23:59

編集2016/04/25 00:03
jjjssskkk

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問