VB2010 DataGridVie CSV読込

このQ&Aのポイント
  • VB2010で出勤簿を作成し、DataGridviewで表示する方法です。
  • 出勤簿のデータをCSV形式で保存し、別のPCでも使用できるようにする方法について教えてください。
  • CSVファイルを読み込む際に、コントロールがデータバインドされている場合にエラーが発生する対処方法を知りたいです。
回答を見る
  • ベストアンサー

VB2010 DataGridVie CSV読込

VB2010で出勤簿を作っています。 社員名簿と出勤簿がDataGridviewで作成され、社員名簿のDataは出勤簿に連動しています。 このDataGirdViewのDataを別のPCにある出勤簿でも使えるようにしたいので、素人考えでCSV形式で保存して、FDに移して別のPCに入れて使ことにしました。(CSV形式でなくても、移動できるのでしたら、そうしたいのですが、方法が分からないので、仕方なくCSV形式を選びました) いろいろ勉強しまして、保存方法は習得しましたが、CSVを読み込む際に、 [コントロールがデータバインドされているとき、DataGridView の行コレクションにプログラムで行を追加することはできません。] というエラーが出ました。 対処方法をご存知の方が居られましたら、ご教授ください。 コードを記載します。 Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click Dim parser As TextFieldParser = New TextFieldParser("savekyoto.csv", Encoding.GetEncoding("Shift_JIS")) parser.TextFieldType = FieldType.Delimited parser.SetDelimiters(",") ' 区切り文字はコンマ '出勤簿のDATAを初期化する Dim j As Integer For j = 0 To Me.DataGridView1.Rows.Count - 2 Me.DataSet11.出勤簿.Rows(j).Delete() Next While (Not parser.EndOfData) Dim row As String() = parser.ReadFields() ' 1行読み込み ' 読み込んだデータ(1行をDataGridViewに表示する) DataGridView1.Rows.Add(row) End While End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

> 素人考えでCSV形式で保存して XMLに一発変換でしょ DataSet.ReadXml(filename) DataSet.WriteXml(filename)

totti1800
質問者

お礼

XMLを全く分からないので、無駄な質問をいたしましてすみませんでした。 既に、回答を簡潔に頂いていたのに、気付かないで遠回りをしていました。 DataSet.WriteXml("kyoto.xml") と書くと簡単に保存できました。 DataSet.ReadXml("kyoto.xml") の場合は、少し手間取りましたが、これを書く前にDatasetを初期化しますとエラーが出なくなりました。 xmlからDatasetに読み込みができます。 少しだけ、XMLが分かりました。 感謝いたします。

totti1800
質問者

補足

XMLを使うのは、初めてなのでいろいろ参考にしながら、DataSet.ReadXml(filename)ではありませんが、次のようなコードを書きました。 プログラムを実行させますと、エラーもなく作動しました。でも、保存先がどこかわかりませんし、実際に保存されているのかも判りませんので、ファイル名を「kyoto.xml」として書き直しました。 'XMLで保存 Dim dtSet As DataSet = New DataSet("出勤簿") Dim dtTbl As DataTable = dtSet.Tables.Add("DATA") dtTbl.Columns.Add("NO", Type.GetType("System.String")) dtTbl.Columns.Add("社員名", Type.GetType("System.String")) dtTbl.Columns.Add("日付", Type.GetType("System.String")) dtTbl.Columns.Add("出勤", Type.GetType("System.String")) dtTbl.Columns.Add("欠勤", Type.GetType("System.String")) dtTbl.Columns.Add("有給", Type.GetType("System.String")) 'データセットにデータを構築 Dim row As DataRow Dim i As Integer For i = 1 To DataGridView1.Rows.Count - 1 row = dtTbl.NewRow() row("NO") = i.ToString() row("社員名") = i.ToString() row("日付") = i.ToString() row("出勤") = i.ToString() row("欠勤") = i.ToString() row("有給") = i.ToString() dtTbl.Rows.Add(row) Next 'DataSet内のデータのXML表現を取得 Console.WriteLine(dtSet.GetXml()) 最後の行の「 Console.WriteLine(dtSet.GetXml())」を 「 Console.WriteLine(dtSet.GetXml(”kyoto.xml”))」に変更しましたが、 エラーメッセージが次のように出ます。 「String "kozo.xml" から型 'Integer' への変換は無効です」 これは、どのように対応すればよろしいでしょうか。 また、使いよいDataSet.ReadXmlの参考書がございましたら、お教えください。 ご教授のほどを宜しくお願い申し上げます。

その他の回答 (2)

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.3

#1です。 詳しくは分からないのですが、CSVを書き出しているほうのDATATABLEの列(NO)の型定義と、読み込んでいるほうのそれと一致していないのではないでしょうか? なお、他の回答者さまのおっしゃるとおり、XMLで書き出して読み込めば悩むことは少ないと思います。 いずれにせよ、書き出し側と読み込み側で列の型を一致させておく必要があります。

totti1800
質問者

お礼

ご教授をありがとうございました。 CSVで保存するのは簡単ですが、保存されたものを書き出すのは列の型定義の一致という作業が入り難しかったです。 一致させてもDataGridViewに表示されるだけで、Datasetに保存されないので、そのあたりの改良も必要と感じいました。 ご指摘のように、XMLで保存・書き出しをすることに致します。 お時間を頂、感謝しています。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.1

DataGridView1にソースデータ(出勤簿)がバインドされているのだと思いますので、DataGridView1に直接行を追加ではなくて元データ(出勤簿)のほうに追加をしていくべきではないでしょうか?

totti1800
質問者

補足

ご教授をありがとうございます。 早速、下記のように訂正しましたところ、 ' 読み込んだデータ(1行をDataset11.出勤簿に表示する) Me.DataSet11.出勤簿.Rows.Add(row) エラーが次のように出ました。 「入力文字列の形式が正しくありません。列 NO に <NO> を格納できませんでした。 必要な型は Int32 です。」 NOは、IntでしたがInt32というようにエラーがでまして、わからなくなりました。 もう少し、ご教授ください。 すみません。

関連するQ&A

  • vb.net web 動的に作成したTableが消える

    よろしくお願いします 現在、vs.net 2005 で web ページを作成しています そこで質問があるので、ご教授の程よろしくお願いします。 test.aspx Table コントロール配置:Table1 Button コントロール配置:Button1 Label コントロール配置:Label1 Label コントロール配置:Label2 test.aspx.vb Partial Class test Inherits System.Web.UI.Page Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load Dim row As TableRow Dim col As TableCell If (Page.IsPostBack = False) Then Label2.Text = "aaa" row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) End If End Sub Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = "Rows.Count" & Table1.Rows.Count End Sub End Class ボタンを押すと、 Label2の "aaa" は保持されていて Table1が保持されないのはなぜなのでしょうか? Table1 の内容を保持させたいのですが その場合、どのようにすればよいのでしょうか

  • VBの Datagridview 行削除コード

    VB2010でコーディングしています。(VB初心者です。) ネットでDatagridview 行削除コードを調べてボタンに実装したんですが、一回目は削除できるんですが 二回目が削除できません。(削除後にデータを再構築できていない?) ご教授お願いします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim DT As New DataTable DT = DirectCast(Me.DGV.DataSource, DataTable) Dim 削除 As Boolean = False '選択行の取得 For Each r As DataGridViewRow In Me.DGV.SelectedRows      Dim ID As String = DT.Rows(r.Index).Item("ID").ToString      (その他の処理) 'リスト上削除 Me.DGV.Rows.RemoveAt(r.Index) Next r End Sub

  • DataGridViewで教えてください。

    DataGridViewで教えてください。 VB初心者ですが どうかよろしくお願いいたします。 VB2005で DataGirdView(dgv1)の始めの行を 他のDataGridView(dgv2)に追加したいのですが、 うまくいきません。 どうすればよいのでしょうか? すみませんが、 教えてください。 よろしくお願いします。 Dim Table As DataTable Dim MainTable As DataTable Dim row As DataRow Table = DirectCast(dgv1.DataSource, DataTable) MainTable = DirectCast(dgv2.DataSource, DataTable) row = MainTable.NewRow row = Table.Rows(0) MainTable.Rows.Add(row)

  • csvの読み込みがうまく行かない

    こんにちは。質問させていただきます。 (Visual Basic 2010 エクスプレス) 下記のように書いたのですが、ファイルの内容どおりに読み込んでくれません。 ファイルの中身は さささ,0,ししししししし すすす,0,せせせせせせ そそそ,0,たたたたた となっているのですが、最初の一行を読み込み、しかも最初の一行を繰り返し2段目3段目の テキストボックスに表示させてしまいます。 具体的には さささ ししししししし さささ ししししししし さささ ししししししし です。 本来は さささ ししししししし すすす せせせせせせ そそそ たたたたた と表示させたいのです。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Using reader As New System.IO.StreamReader("C:\csvtest\test.csv", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items() As String 'CSVの各項目を表す配列 Dim Line As String = reader.ReadLine 'CSVの一行 Do Until IsNothing(Line) Items = Line.Split(",") '一行を, (カンマ)で区切って項目ごとに分解 With reader TextBox1.Text = Items(0) CheckBox1.CheckState = Items(1) TextBox2.Text = Items(2) Line = reader.ReadLine '次の行を読み込む。 TextBox3.Text = Items(0) CheckBox1.CheckState = Items(1) TextBox4.Text = Items(2) Line = reader.ReadLine '次の行を読み込む。 TextBox5.Text = Items(0) CheckBox1.CheckState = Items(1) TextBox6.Text = Items(2) Line = reader.ReadLine '次の行を読み込む。 .Close() End With Loop End Using End Sub 問題点がわかる方、よろしくおねがいします!

  • VB2010DataGridView複数ページ印刷

    VB2010のDataGridViewで複数ページの印刷を試みています。 改ページに悩んでいます。「e.HasMorePages=True」で改ページは可能ですが、1ページ目も2ページ目も同じ内容が印刷されます。 1ページに30行を印刷する予定ですので、2ページ目には31行目から印刷をしたいのです。 現在、いろいろ参考にしまして、コーディングは進んでいますが、30行の指定がページ目いっぱいまで印刷される点と、2ページ目以降の印刷ができない点に悩んでいます。 書き上げたコードを記述しますので、ご存知の方が居られましたら、ご教授ください。 Dim reader As IO.StreamReader Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click PrintPreviewDialog1.ShowDialog() PrintPreviewDialog1.Document = PrintDocument1 'file() ' 印刷処理を実行 'PrintDocument1.Print() 'PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.FullWindow) 'PrintDocumentオブジェクトの作成 Dim pd As New System.Drawing.Printing.PrintDocument 'PrintPageイベントハンドラの追加 AddHandler pd.PrintPage, AddressOf pd_PrintPage 'PrintDialogクラスの作成 Dim pdlg As New PrintDialog 'PrintDocumentを指定 pdlg.Document = pd '印刷の選択ダイアログを表示する If pdlg.ShowDialog() = DialogResult.OK Then 'OKがクリックされた時は印刷する pd.Print() End If End Sub Dim page As Integer = 0 '現在のページ Private Const MaxLine As Integer = 30 '1ページ30行 Private Sub pd_PrintPage(ByVal sender As Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) page += 1 'グラフィックの定義 Dim g As Graphics = e.Graphics '総行数をallrowとする Dim allrow As Integer = DataGridView1.Rows.Count - 1 '文字列を描く 'g.DrawString(DataGridView1(0, 0).Value, _ ' New Font("MS Pゴシック", 9), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top) Dim X As Integer Dim Y As Integer Y = e.MarginBounds.Top For i As Integer = 0 To DataGridView1.Rows.Count - 1 X = e.MarginBounds.Left For j As Integer = 0 To DataGridView1.Columns.Count - 1 Dim s As String If DataGridView1(j, i).Value Is Nothing Then s = "" Else s = DataGridView1(j, i).Value End If g.DrawString(s, New Font("MS Pゴシック", 9), Brushes.Black, X, Y) 'g.DrawString(DataGridView1(j, i).Value.ToString, _ ' New Font("MS Pゴシック", 9), Brushes.Black, X, Y) X += DataGridView1.Columns(j).Width Next j Y += DataGridView1.Rows(i).Height Next i '現在のページが総ページ数より少ない場合は、次ページへ If page < (allrow \ MaxLine + 1) Then e.HasMorePages = True Else 'このページで終了 e.HasMorePages = False End If End Sub

  • VBを2008を用いてCSVを取り込む ””で区切られていない数値混入

    VBを2008を用いてCSVを取り込む ””で区切られていない数値混入 文字列に,が含まれている場合がある。 題名どおりなのですが、以下のようなCSVファイルをVB2008で取り込もうと考えています。 "AAAAA",BBBBB,CCCCC,"DDDD,DDD","EEEEE","FFFFF" (同じアルファベットが本来同じ項目のデータ、BとCは0-9の数字のみ入ります またBCには常に””が含まれません。 Dは文字列なのですが、まれに「,」が含まれます) 下のものが現在使用しているソースですがsplitで「,」を指定しているので 当然Dが2つのデータとして認識されています。 BやCが””で囲まれていれば「”,”」で区切ればすむのですが一部が””なしなので どうやろうか迷っています。 実現したいこととしては ""なしの時は必ず、コンマまでが1つのデータ、 ""があれば""で区切られたデータが1つのデータとできればいいんですが。。。 以下ソースです。 ちなみにASPXファイルです。 (replaceDoubleQuotesというのは”を削除するための関数で無視していただいて結構です。 また以下のソースでは取り込み自体はせずにタイトル行がはいっているCSVファイルを弾く作業をしているのですが CSVからデータを取り出す作業は同じなので短いソースを使用させてもらっています) Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim Reader2 As New IO.StreamReader("C:\UploadedFiles\Uriage.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items2() As String 'CSVの各項目を表す配列 Dim Line2 As String = Reader2.ReadLine 'CSVの一行 Items2 = Line2.Split(",") Dim num_hantei As String = "^[0-9]+$" If Not (Regex.IsMatch(replaceDoubleQuotes(Items2(3)), num_hantei)) Then Dim objFSO As Object objFSO = CreateObject("Scripting.FileSystemObject") objFSO.DeleteFile("C:\UploadedFiles\Uriage.txt", True) objFSO = Nothing Label1.Text = "取り込みエラー。タイトル行がはいっている可能性があります。" Exit Sub End If Reader2.Close() End Sub Function replaceDoubleQuotes(ByVal apdata As Object) As String '文字列に変換する Dim tmp As String = String.Format("{0}", apdata) '1つのダブルクォーテーションを0個に置換する つまり消去する replaceDoubleQuotes = tmp.Replace("""", "") End Function

  • VB.net 2010 DataGrigView

    VBでDataGridViewを使用して表の入力処理をして居ます。 入力内容が数字で無い時はエラー表示をして、セルのフォーカスをエラーセルに戻そうとして居ます。 実際にプログラムを組んだのですが、エラー時にセルのフォーカスが元に戻らす、エラーで無い時と同じ様に次の行に行ってしまいます。 エラー時にRow、Columnのアドレスを保存して置き、ボタンでそのRow、Columnの場所にセルのフォーカスを当てると、その位置のセルにフォーカスが当たります。 コーディング上は全く同じですが、同一処理内ではフォーカスの設定は出来ないものでしょうか。 試しに間にApplication.DoEvents()を入れてみましたが結果は同じでした。 どなたかこの現象を解決出来る方法が分かる方、若しくはDataGridViewではこの様な事は出来ない理由をご存知の方、お教え下さる様お願い致します。 ‘CellEndEdit割り込み処理 Private Sub dgvTst_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvTst.CellEndEdit Dim iVal As Integer Dim sWrk As String sWrk = dgvTst.CurrentCell.Value ‘セルの値をワークに If subChkDec(sWrk) = False Then '数字か調べる。 MsgBox("Error") ‘数字で無い時、エラー表示 iRow = dgvTst.CurrentCell.RowIndex ‘Rowアドレス取得 iCol = dgvTst.CurrentCell.ColumnIndex ‘Columnアドレス取得 lblRow.Text = iRow.ToString("D") ‘デバックの為にRow表示 lblCol.Text = iCol.ToString("D") ‘デバックの為にColumn表示 Application.DoEvents() dgvTst.CurrentCell = dgvTst.Rows(iRow).Cells(iCol) ‘RowとColumnを指定してセル位置変更したつもり、フォーカスは入力したセルの下に移動する。 End If End Sub ‘ボタンでの割り込み処理。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click dgvTst.CurrentCell = dgvTst.Rows(iRow).Cells(iCol) ‘同じ処理をボタンの割り込みで行うと指定した(エラーとなった)所にフォーカスが移る。 End Sub

  • Excelで作成されたCSVのVBでの読み込み

    いつもお世話になっております。 Excel2K、2002を使用しております。 Excelで作成されたCSVファイルをVBAで読み込もうと、以下の関数を作成しました。 Public Function CsvRead(ByVal FileName As String)   Dim IntFileNum As Integer 'ファイル番号   Dim TmpStr As String '   IntFileNum = FreeFile   Open FileName For Input As #IntFileNum 'CSVファイルのオープン   Do Until EOF(IntFileNum)     Input #IntFileNum, TmpStr     '     '~その他の処理~     '   Loop   Close End Function その他の処理中で特定の列に対し、特殊な処理を行う必要があるのですが ExcelでCSVファイルを作成する場合、16行単位でカンマの変動が起こりえますので、 http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B400253 正確な列が取れません。 そこで1行読み込んでカンマで分解すればよいかと思い、 以下のように読み込んでみたのですが、、   Dim TmpStr() As String '   Dim LineStr As String   IntFileNum = FreeFile   Open FileName For Input As #IntFileNum 'CSVファイルのオープン   Do Until EOF(IntFileNum)     Line Input #IntFileNum, LineStr     TmpStr = Split(LineStr, ",")     '     '~その他の処理~     '   Loop 値にカンマが存在する場合も区切ってしまうので これも正しく取れませんでした。 値のカンマは区切り文字として判定せず、 正しく値を取得するにはどのようにすればよいでしょうか。 上記のことをふまえた判定をすべて行うしかないでしょうか。 ご教授のほど、よろしくお願いいたします。

  • CSVの読み込み処理について

    こんばんわです。 エクセルのVBAをつかってCSV形式のファイルデーターを読み込みように某サイトを参考に作成しました。 確かに読み込む事が出来たのですが、数値も文字列扱いになってしまいます。 数値処理する方法があるのでしょうか? Sub CSV_Read2() Dim FileType, Prompt As String Dim FileNamePath As Variant Dim textline, csvline() As String Dim Rowcnt, ColumNum As Integer Dim ch1 As Long FileType = "CSV ファイル (*.csv),*.csv" Prompt = "CSV File を選択してください" '操作したいファイルのパスを取得します FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 'エラーが発生したらファイルを閉じます 'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、 '色々なCSVがあるようなので入れておきます On Error GoTo CloseFile '表の行番号の初期化 1行目から読み込んだデータを入力します Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認します。 '1行読み込みます Line Input #ch1, textline 'ダブルクォーテーションを削除します 'カンマ+ダブルクォーテーションで区切られている CSV ファイルなどは '適時追加してください textline = Replace(textline, """", "") 'カンマで分離します csvline() = Split(textline, ",") '配列渡しでセルに代入 Range(Cells(Rowcnt, 1), Cells(Rowcnt, UBound(csvline()) + 1)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: 'ファイルを閉じます Close #ch1 End Sub Function SelectFileNamePath(FileType, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt) End Function Function GetItemNum(FileNamePath) As Integer Dim ch1 As Long Dim textline As String '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 Line Input #ch1, textline '1行だけ読み込みます。 Close #ch1 GetItemNum = 1 '1行中のカンマの数を数えます Do GetItemNum = GetItemNum + 1 textline = Mid(textline, InStr(textline, ",") + 1) Loop Until InStr(textline, ",") = 0 End Function

  • VB2005 CSVファイルをテーブルへインポート

    こんばんは。 VB2005にてCSVファイルをテーブルへ、インポートする処理を作成しています。ネットで調べたコードを試しています。デバックは通るのですが、処理結果がテーブルへ出力されません。 (TESTdataset内にTable1を作成しています。) 何か解決案がありましたらご教示をお願いいたします。 また、 ※1の'DataGridView1の文なのですが、コメントを外すと 宣言がされていない旨のメッセージが出てきてしまいます。 もし此方も解決案が御座いましたらご教示をお願いいたします。 -------------------------------------------------------------- 以下コードです -------------------------------------------------------------- Imports System.Data Imports System.Data.OleDb Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Const csvPath As String = "c:\DB\" Const csvFile As String = "TEST.csv" Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & csvPath _ & ";" & "Extended Properties='text;FMT=Delimited'" Dim objConn As New OleDbConnection(sConnectionString) objConn.Open() Dim objCmdSelect As New OleDbCommand("SELECT * FROM " & csvFile, objConn) Dim objAdapter1 As New OleDbDataAdapter() objAdapter1.SelectCommand = objCmdSelect Dim objDataset1 As New DataSet() Dim objTable As DataTable Dim Col As DataColumn objDataset1 = New DataSet("TEST") objTable = New DataTable("Table1") Col = New DataColumn("No") Col.DataType = Type.GetType("System.Int16") objTable.Columns.Add(Col) Col = New DataColumn("Name") Col.DataType = Type.GetType("System.String") objTable.Columns.Add(Col) Col = New DataColumn("出身") Col.DataType = Type.GetType("System.String") objTable.Columns.Add(Col) objDataset1.Tables.Add(objTable) objAdapter1.Fill(objDataset1.Tables(0)) ※1'DataGridView1.DataSource = objDataset1.Tables(0).DefaultView objConn.Close() End Sub End Class --------------------------------------------------------- ※お礼が遅れる場合がありますが、必ずしますので、その時は少々お待ちください。

専門家に質問してみよう