トップ回答者
データテーブルのCSV保存について

質問
-
下記のコードでデータテーブルをCSV保存しようと試みましたが一番下の行が消えてしまいます。
どのように修正すればいいでしょうか?
ご教示お願い致します。
Private Sub btn_hozon_Click(sender As Object, e As EventArgs) Handles btn_hozon.Click
ConvertDataTableToCsv(database_DataTable, "C:test.csv", True)
End Sub''' <summary>
''' DataTableの内容をCSVファイルに保存する
''' </summary>
''' <param name="dt">CSVに変換するDataTable</param>
''' <param name="csvPath">保存先のCSVファイルのパス</param>
''' <param name="writeHeader">ヘッダを書き込む時はtrue。</param>
Public Sub ConvertDataTableToCsv(dt As DataTable, csvPath As String, writeHeader As Boolean)
'CSVファイルに書き込むときに使うEncoding
Dim enc As System.Text.Encoding =
System.Text.Encoding.GetEncoding("Shift_JIS")
'書き込むファイルを開く
Dim sr As New System.IO.StreamWriter(csvPath, False, enc)
Dim colCount As Integer = dt.Columns.Count
Dim lastColIndex As Integer = colCount - 1
Dim i As Integer
'ヘッダを書き込む
If writeHeader Then
For i = 0 To colCount - 1
'ヘッダの取得
Dim field As String = dt.Columns(i).Caption
sr.Write(field)
'カンマを書き込む
If lastColIndex > i Then
sr.Write(","c)
End If
Next
'改行する
sr.Write(vbCrLf)
End If
'レコードを書き込む
Dim row As DataRow
For Each row In dt.Rows
For i = 0 To colCount - 1
'フィールドの取得
Dim field As String = row(i).ToString()
'フィールドを書き込む
sr.Write(field)
'カンマを書き込む
If lastColIndex > i Then
sr.Write(","c)
End If
Next
'改行する
sr.Write(vbCrLf)
Next
'閉じる
sr.Close()
End Sub
回答
-
DataGridView の入力値が確定前の状態であり、該当行がまだ DataTable に追加されていない状態なのでしょう。(Esc キーを押すと、最終行の内容がロールバックされる状態ではありませんか?)
DataSource として BindingSource 等を用いてバインドしている場合には、BindingSource の EndEdit メソッドを呼び出すことで、現在行の編集が確定されます。
DataSource に DataSet / DataTable / DataView を割り当てている場合には、下記のようにすることも出来ます。
- 回答としてマーク T.K.Tora 2018年3月14日 13:35
すべての返信
-
佐祐理さん、trapemiyaさん回答ありがとうございます。
データテーブルへのデータの追加は下記のコードで行っているのですがこのボタンに問題があるのでしょうか?
'追加ボタン
Private Sub btn_add_Click(sender As Object, e As EventArgs) Handles btn_add.Click
Dim aaa As String = Me.txt_aaa.Text
Dim iii As String = Me.txt_iii.Text
Dim uuu As String = Me.txt_uuu.Text
Dim eee As String = Me.txt_eee.Text
Dim ooo As String = Me.label_ooo_result.Text
Dim kkk As String = Me.label_kkk_result.Text
' Create new DataTable and DataSource objects.
Dim database_DataAddTable As DataTable = New DataTable()
' Declare DataColumn
Dim column As DataColumn
' Create new DataColumn, set DataType, ColumnName and add to DataTable.
column = New DataColumn()
column.DataType = Type.GetType("System.String")
column.ColumnName = "あああ"
database_DataAddTable.Columns.Add(column)
column = New DataColumn()
column.DataType = Type.GetType("System.String")
column.ColumnName = "いいい"
database_DataAddTable.Columns.Add(column)
column = New DataColumn()
column.DataType = Type.GetType("System.String")
column.ColumnName = "ううう"
database_DataAddTable.Columns.Add(column)
column = New DataColumn()
column.DataType = Type.GetType("System.String")
column.ColumnName = "えええ"
database_DataAddTable.Columns.Add(column)
column = New DataColumn()
column.DataType = Type.GetType("System.String")
column.ColumnName = "おおお"
database_DataAddTable.Columns.Add(column)
column = New DataColumn()
column.DataType = Type.GetType("System.String")
column.ColumnName = "かかか"
database_DataAddTable.Columns.Add(column)
' Create new DataRow objects and add to DataTable.
Dim database_DataView As DataView = database.DataSource
Dim database_DataRowView As DataRowView = database_DataView.AddNew
database_DataRowView("あああ") = aaa
database_DataRowView("いいい") = iii
database_DataRowView("ううう") = uuu
database_DataRowView("えええ") = eee
database_DataRowView("おおお") = ooo
database_DataRowView("かかか") = kkk
database_DataAddTable.Rows.Add(database_DataRowView)
-
DataGridView の入力値が確定前の状態であり、該当行がまだ DataTable に追加されていない状態なのでしょう。(Esc キーを押すと、最終行の内容がロールバックされる状態ではありませんか?)
DataSource として BindingSource 等を用いてバインドしている場合には、BindingSource の EndEdit メソッドを呼び出すことで、現在行の編集が確定されます。
DataSource に DataSet / DataTable / DataView を割り当てている場合には、下記のようにすることも出来ます。
- 回答としてマーク T.K.Tora 2018年3月14日 13:35