• 締切済み

DataTableのデータを保存したい

VB初心者です VB2008を使用してカロリー計算ができるプログラムを作成しています DataTableに摂取カロリーと消費カロリーをユーザが追加でき、 そのDataTableのデータをCSVファイルとして保存しようと考えています こちらのサイトhttp://pckowaza.web.fc2.com/html/vbdotnet_datagridview_savetocsv.html からコピーしてやってみたのですが Public Sub SaveToCsv(tempDgv As System.Windows.Forms.DataGridView)' のパラメータ 'tempDgv' に対して引数が指定されていません。 とエラーが出ます どこを直せば良いのでしょうか? 以下、プログラムです '保存したいDataGridViewコントロールの名前を引数として '設定します。 Public Sub SaveToCsv(ByVal tempDgv As DataGridView)   '1行もデータが無い場合は、保存を中止します。   If tempDgv.Rows.Count = 0 Then     Exit Sub   End If   '変数を定義します。   Dim i As Integer   Dim j As Integer   Dim strFileName As String   Dim strResult As New System.Text.StringBuilder   '保存ダイアログでファイル名を設定した場合に処理を実行します。   If Me.sfdCsvFile.ShowDialog = _     Windows.Forms.DialogResult.OK Then     'コラムヘッダを1行目に列記します。     '※ヘッダ行が不要な場合は削除可能です。     For i = 0 To tempDgv.Columns.Count - 1       Select Case i         Case 0          strResult.Append("""" & _          tempDgv.Columns(i).HeaderText.ToString & """")         Case tempDgv.Columns.Count - 1          strResult.Append("," & """" & _          tempDgv.Columns(i).HeaderText.ToString & _          """" & vbCrLf)         Case Else          strResult.Append("," & """" & _          tempDgv.Columns(i).HeaderText.ToString & """")       End Select     Next     'データを保存します。     '※新規行の追加を認めている場合は、次行の     「tempDgv.Columns.Count - 1」を     '「tempDgv.Columns.Count - 2」としてください。     For i = 0 To tempDgv.Rows.Count - 1       For j = 0 To tempDgv.Columns.Count - 1         Select Case j           Case 0            strResult.Append("""" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """")           Case tempDgv.Columns.Count - 1            strResult.Append("," & """" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """" & vbCrLf)           Case Else            strResult.Append("," & """" & _            tempDgv.Rows(i).Cells(j).Value.ToString & _            """")         End Select       Next     Next     'ファイル名を保存ダイアログで指定した値に設定します。     strFileName = Me.sfdCsvFile.FileName     'Shift-JISで保存します。     Dim swText As New System.IO.StreamWriter(strFileName, _       False, System.Text.Encoding.GetEncoding(932))     swText.Write(strResult.ToString)     swText.Dispose()   End If End Sub DataGridViewの定義?はこれです Designer.vbに書かれていたものです 'DataGridView1 ' Me.DataGridView1.AutoGenerateColumns = False Me.DataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize Me.DataGridView1.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.名前DataGridViewTextBoxColumn, Me.カロリーkcalDataGridViewTextBoxColumn}) Me.DataGridView1.DataSource = Me.DataTable1BindingSource3 Me.DataGridView1.Location = New System.Drawing.Point(424, 35) Me.DataGridView1.Name = "DataGridView1" Me.DataGridView1.RowTemplate.Height = 21 Me.DataGridView1.Size = New System.Drawing.Size(429, 422) Me.DataGridView1.TabIndex = 3 ' '名前DataGridViewTextBoxColumn ' Me.名前DataGridViewTextBoxColumn.DataPropertyName = "名前" Me.名前DataGridViewTextBoxColumn.HeaderText = "名前" Me.名前DataGridViewTextBoxColumn.Name = "名前DataGridViewTextBoxColumn" ' 'カロリーkcalDataGridViewTextBoxColumn ' Me.カロリーkcalDataGridViewTextBoxColumn.DataPropertyName = "カロリー(kcal)" Me.カロリーkcalDataGridViewTextBoxColumn.HeaderText = "カロリー(kcal)" Me.カロリーkcalDataGridViewTextBoxColumn.Name = "カロリーkcalDataGridViewTextBoxColumn" '

みんなの回答

回答No.1

質問には書かれていない、SaveToCsv()の呼び方が間違ってるだけ。 エラーメッセージの通りで、これ以上説明のしようが無い。 エラーメッセージは気まぐれに表示しているわけじゃない。 どこがおかしいか、どこを直すべきかを教えてくれています。

関連するQ&A

  • VB2010でデータグリッドビューに列追加

    VB2010でデータグリッドビューを使用したいのですが、 下記のコードを実行すると、 ※エラー1「指定された列は DataGridView コントロールに既に属しています。」がでます。 列インデックスがいるのかなと、コードを追加してみると ※エラー2「プロパティIndexはReadOnlyです」がでました。 どう直せばよいかわかるかた教えてください。 どうぞよろしくお願いします。 変数に入っているもの 系列数=2 系列名(0)=deg 系列名(1)=V 系列名(2)=P Public Class Form2 Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "データビュー" '初期化 Me.DataGridView1.Columns.Clear() '列追加 Dim i, j As Long Dim TBColumn As New DataGridViewTextBoxColumn() For i = 0 To 系列数 TBColumn.Name = 系列名(i) TBColumn.Index = i '←※エラー2 エラー後に追加してみた Me.DataGridView1.Columns.Add(TBColumn) '←※エラー1 Next i '行追加 Me.DataGridView1.RowCount = データ数 'データ追加 For j = 1 To データ数 For i = 0 To 系列数 Me.DataGridView1(系列名(i), CInt(j - 1)).Value = グラフデータ(i, j) Next i Next j '列幅設定 For i = 0 To DataGridView1.Columns.Count - 1 Me.DataGridView1.Columns(i.ToString).Width = 30 Next i End Sub End Class

  • VB2005 DataGridViewにチェックボックスを追加する方法

    タイトル通りなのですが VB2005でDataGridViewにチェックボックスを追加したいです。 ############################################################### Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim chColumn As New DataGridViewCheckboxColmun DataGridView1.ColumnCount = 5 DataGridView1.Columns(0).HeaderText = "1" DataGridView1.Columns(1).HeaderText = "2" DataGridView1.Columns(2).HeaderText = "3" DataGridView1.Columns.Insert(4, chColumn) End Sub End Class ############################################################## Dim chColumn As New DataGridViewCheckboxColmun ↑で'型'DataGridViewCheckboxColmunが定義されていません となってしまいます。 どうすればよいでしょうか。。。。 プログラム初めて1週間の初心者なのでお手柔らかに よろしくお願いします。

  • VB2005EE:DataGridViewでチェックボックスを設けるには

    はじめまして DataGridView(VB2005EE)でチェックボックスを設ける方法を教えていただきたく質問させていただきました。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '3つの列を設定し,ABCという列名をつける DataGridView1.ColumnCount = 5 DataGridView1.Columns(0).HeaderText = "A" DataGridView1.Columns(1).HeaderText = "B" DataGridView1.Columns(2).HeaderText = "C" Dim myNewCell As New DataGridViewCheckBoxCell DataGridView1.Columns.Insert(3, New DataGridViewColumn(myNewCell)) DataGridView1.Columns.Item(3).HeaderText = "チェックボックス" DataGridView1.Columns.Item(3).Name = "識別名" DataGridView1.RowCount = 4 '最下行に管理用の行設置 End Sub End Class 手元の本を参考に上記のコードでコンパイルを行うと, >DataGridViewで釣りの例外が発生しました: >System.FormatException:セルのフォーマットされた値に間違った型が>指定されています。 >この既定のダイアログを置き換えるには,DataErrorイベントをハンド>ルしてください。 というエラーダイアログが発生します。 まだプログラミングを始めたばかりという事もあり,右も左もわかりませんが,ご教授お願い致します。

  • DataGridViewから値取得

    DataGridViewにボタンと項目2つが配置されています。 DataGridView1 DataGridView1.Columns("btn").HeaderText = "ボタン" DataGridView1.Columns("item1").HeaderText = "アイテム1" DataGridView1.Columns("item2").HeaderText = "アイテム2" ボタンを押すと、押した行のレコードを取得したいです。 ボタンのところを押下すると、 イベントハンドラで何行目か分かるサンプルをネットで見つけました。 惜しいですが、やりたいのと少し違いました。 'CellContentClickイベントハンドラ Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick Dim dgv As DataGridView = CType(sender, DataGridView) Dim test_item1 As String Dim test_item2 As String ' "btn"列ならば、ボタンがクリックされた If dgv.Columns(e.ColumnIndex).Name = "btn" Then MessageBox.Show((e.RowIndex.ToString() + "行のボタンがクリックされました。")) End If ' ここに押された行のitem1の値をセット ' test_item1 = (A) ' ここに押された行のitem2の値をセット ' test_item2 = (B) End Sub (A)、(B)に何を記述すれば値を取得できますか?

  • DataGridViewで行選択して、対応するDataTableの行を得るには?

    いつもお世話になっております。VB2005環境です。 DataGridViewの行を選択したときに、そのソースであるDataTableの同じ行のデータを参照するには、どうしたらいいでしょうか。DataTableのデータをまるごとDataGridViewに表示しているわけではないので、必要に応じて直接DataTableから取得したいです。とても初歩的な質問だと思うのですが・・・。 DataGridView1.DataSource = DataTable  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Dim r As Integer = DataGridView1.CurrentCell.RowIndex Dim str As String str = DataTable.Rows(r)("項目名") MsgBox(str)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このように行インデックスを取得してやってみたのですが、これだとDataGridView上でソートすると行番号が変わってしまい、DataTable側の対応する行のデータが得られません。 もう少し詳しく現状を書くと、まずCSVファイルからデータをロードして、DataTableに渡しています。そして、その内容をDataGridViewに表示しているのですが、表示する内容はデータテーブル通りの構造ではなく、表示する必要がある項目だけを選んで、1つずつカラムを追加してバインドいます。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ’自動で列を追加しないようにする DataGridView1.AutoGenerateColumns = False ’データソースを指定する DataGridView1.DataSource = DataTable ’1つ1つ順番などを変えながら列を追加していく Dim column1 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Date" column1.HeaderText = "日付" column1.DataPropertyName = "F4" Dim column2 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Locatoin" column1.HeaderText = "場所" column2.DataPropertyName = "F1" ・ ・ ・  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ こんな感じでなので、表示されていない列のデータについては、必要に応じて直接DataTableから取得したいと思います。アドバイスよろしくお願いいたします<(_ _)>

  • VB2005 Datagridview の仮想モードでメモリリーク

    VB2005にてDatagridviewの仮想モードを実装しています。 DataGridviewを全件ループ処理する場合にメモリが増加します。完了してもそのままメモリが減りません。これを回避する方法がありますか?CellValueNeededはメモリを消費し続けるものなのでしょうか。 実際のプログラムでは件数が多い場合にメモリの消費が止まらずメモリ不足に陥ります。 以下は単純なコードにしたサンプルです。これでもデバッグモードで動かすと起動時20Mくらいのメモリ消費がループ処理時に100Mくらいにに増えます。 ※実際の処理でバインドしているデータ(datatable等)の方をループさせるという代替案がありますが、今回はdatagridviewから行った結果のメモリ不足についてご教授いただければと思います。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.DataGridView1 .Columns.Add("Column1", "列1") .Columns.Add("Column2", "列2") .Columns.Add("Column3", "列4") .Columns.Add("Column4", "列4") .Columns.Add("Column5", "列5") .Columns.Add("Column6", "列6") .Columns.Add("Column7", "列7") .VirtualMode = True .RowCount = 100000 End With End Sub Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellValueEventArgs) _ Handles DataGridView1.CellValueNeeded e.Value = e.RowIndex.ToString & "," & e.ColumnIndex.ToString End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(i).Cells(1).Value = DataGridView1.Rows(i).Cells(2).Value Next MsgBox("終了") End Sub

  • データグリッドビューの任意の列を削除

    VB2010にて、下記のコードを実行すると、左端にいらない列が表示されます。 左端にコンボボックスを表示したいのですが、うまくいきません。 左端の列を削除する方法。 または、左端にコンボボックスを表示する方法を教えていただけませんでしょうか。 ご存知の方、どうぞよろしくお願いいたします。 '■■■データグリッドビューセット■■■ '初期化 Me.DataGridView1.Columns.Clear() '最下部の新しい行を非表示 Me.DataGridView1.AllowUserToAddRows = False '行追加 Me.DataGridView1.RowCount = 気筒数 + 2 'コンボボックス列を追加 Dim i As Integer Dim BS As New BindingSource() For i = 1 To 系列数 BS.Add(系列名(i)) Next i Dim ComboBox As New DataGridViewComboBoxColumn() ComboBox.HeaderText = "系列名を選択" ComboBox.DataSource = BS Me.DataGridView1.Columns.Add(ComboBox) Me.DataGridView1.Columns(0).Width = 110

  • DataSet(DataTable)の使い方

    GridViewやListViewなどに動的にデータを追加していきたいので、 DataTableを使おうと思いました。 下記、(1)のようにPageLoadイベントで1行追加することはできたのですが、 ボタンを押すごとに、1行ずつ追加していきたいので(2)のように修正したのですが、 ボタンを押したときのポストバックで、DataSetもDataTableもnullになってしまい、 行の追加ができません。 ボタンを押すごとにどんどん行を追加していきたいのですが、このような場合は どのようにDataSetもDataTableを保持しておけば良いのでしょうか。 (1) public partial class WebForm1 : System.Web.UI.Page { int count = 0; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataSet dS = new DataSet("dS"); DataTable dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } } } (2) public partial class WebForm2 : System.Web.UI.Page { int count = 0; DataSet dS; DataTable dT; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { dS = new DataSet("dS"); dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); } } protected void Button1_Click(object sender, EventArgs e) { count = count + 1; DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } }

  • DataGridViewのコンボボックスについて

    開発環境:Visual Basic 2005 DataGridViewのDataGridViewTextBoxColumnの1行目をコンボボックスにして、 そのコンボボックスのドロップダウン幅を100に設定しようとしていますが、うまくいきません。 DataGridViewをフォームに貼り付け、以下のプログラムを実行すると、幅が120くらいになってしまいます。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DataGridView1.Columns.Clear() DataGridView1.AllowUserToAddRows = False Dim TextColumn As New DataGridViewTextBoxColumn TextColumn.Name = "Name" TextColumn.Width = 100 Dim ComboColumn As New DataGridViewComboBoxColumn ComboColumn.Name = "Type" Dim List() As String = {"Type A", "Type B", "Type O"} ComboColumn.DataSource = List ComboColumn.DropDownWidth = 100 DataGridView1.Columns.Add(TextColumn) DataGridView1.Columns.Add(ComboColumn) For i As Integer = 1 To 5 DataGridView1.Rows.Add() Next Dim ComboCell As New DataGridViewComboBoxCell Dim NameList() As String = {"Name A", "Name B", "Name C"} ComboCell.DataSource = NameList ComboCell.DropDownWidth = 100 DataGridView1.Rows(0).Cells(0) = ComboCell End Sub どこが問題なのかどなたかご教授いただけると助かります。どうぞよろしくお願い致します。

  • DataGridView 複数選択で行番号の取得

    Visual Basic 2008 を使っています。 DataGridViewで複数の行を選択したとき、それぞれが何行目なのかを取得するにはどうしたらいいでしょうか? 具体的には、複数選択されている行の0列目の値をテキストボックスに表示するという動作を行いたいです。 自分で書いたコードをペーストしておきます。 Dim count As Integer = Me.DataGridView1.SelectedRows.Count For count = 0 To count - 1 Dim test As String test = Me.DataGridView1.Rows(?何行目か).Cells(0).Value Me.TextBox4.Text = test & "が選択されています。" & vbCrLf & zenkai Dim zenkai As String = Me.TextBox1.Text Next

専門家に質問してみよう