none
DataGridViewへの行追加保存について RRS feed

  • 質問

  • フォーム1に
    処理日.Text
    取扱日.Text
    値1.Text
    値2.Text
    値3.Text
    のテキストボックスがあります。
    データ転記ボタンをクリックするとフォーム2(データ保存シート2)のDataGridView1にテキストボックスの内容が転記されますが
    テキストボックスの値を変えてデータ転記ボタンをクリックするとDataGridView1に転記されますが最初のデータに
    上書きされてしまいます。最初のデータは残していき次行(データ更新の都度)へデータを転記させて行きたいのですがコードがわかりません。
    ご指導お願いします。
    「現行コード」
        Private Sub データ転記_Click(sender As Object, e As EventArgs) Handles データ転記.Click
            Dim f As データ保存シート2
            f = New データ保存シート2
            f.DataGridView1.Rows.Add(Me.処理日.Text, Me.取扱日.Text, Me.値1.Text, Me.値2.Text, Me.値3.Text)

            f.ShowDialog(Me)
        End Sub
    2018年5月4日 3:14

回答

  • f = New データ保存シート2 としているので、データ転送ボタンを押す度にデータ保存シート2が作成されてしまいます。
    Newは新たにインスタンスを作成する命令です。インスタンスとは
    データ保存シート2の分身です。つまり、、データ転送ボタンを押す度にデータ保存シート2の分身が作られ、DataGridView1に最初の1行を追加されて、テキストボックスの値がセットされることになります。

    この問題を解決するには、データ保存シート2のインスタンス(分身)を最初に作ったら、それを使いまわすことです。Newで新たなデータ保存シート2のインスタンス(分身)を作ってはいけません。以下のようにしてみて下さい。

    Dim f As データ保存シート2
    
    Private Sub Bttn_例外まとめて補足_Click(sender As Object, e As EventArgs) Handles Bttn_例外まとめて補足.Click
    
        If f Is Nothing Then
            f = New データ保存シート2()
        End If
    
        f.DataGridView1.Rows.Add(Me.処理日.Text, Me.取扱日.Text, Me.値1.Text, Me.値2.Text, Me.値3.Text)
    
        f.ShowDialog(Me)
    
    End Sub
    上記のように常にインスタンスを1つしか作らないデザインパターンをシングルトンと呼びます。

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年5月4日 3:28
    モデレータ
  • まず、自分の書かれたコードの意味を100%完全に理解するようにして下さい。他からコードを持ってきてもいいですが、そのコードの意味を100%理解して下さい。

            Dim swText As New System.IO.StreamWriter(strFileName,
                  False, System.Text.Encoding.GetEncoding(932))

    と、書かれていますが、2番目に引数のFalseが何を意味するのかわかりますでしょうか? 答えはそこにあります。

    ファイルにテキストを書き込むには?[C#、VB]
    http://www.atmarkit.co.jp/ait/articles/0711/08/news119.html

    #上記の追加の質問は、このスレッドのタイトルから外れていないと判断しましたが、新たに質問を始める場合は、基本的に新たにスレッドを立てるようにお願いいたします。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年5月4日 6:40
    モデレータ

すべての返信

  • f = New データ保存シート2 としているので、データ転送ボタンを押す度にデータ保存シート2が作成されてしまいます。
    Newは新たにインスタンスを作成する命令です。インスタンスとは
    データ保存シート2の分身です。つまり、、データ転送ボタンを押す度にデータ保存シート2の分身が作られ、DataGridView1に最初の1行を追加されて、テキストボックスの値がセットされることになります。

    この問題を解決するには、データ保存シート2のインスタンス(分身)を最初に作ったら、それを使いまわすことです。Newで新たなデータ保存シート2のインスタンス(分身)を作ってはいけません。以下のようにしてみて下さい。

    Dim f As データ保存シート2
    
    Private Sub Bttn_例外まとめて補足_Click(sender As Object, e As EventArgs) Handles Bttn_例外まとめて補足.Click
    
        If f Is Nothing Then
            f = New データ保存シート2()
        End If
    
        f.DataGridView1.Rows.Add(Me.処理日.Text, Me.取扱日.Text, Me.値1.Text, Me.値2.Text, Me.値3.Text)
    
        f.ShowDialog(Me)
    
    End Sub
    上記のように常にインスタンスを1つしか作らないデザインパターンをシングルトンと呼びます。

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年5月4日 3:28
    モデレータ
  • trapemiyaさん、DataGridView1に複数行のデータが表示される用になりましたできました、ありがとうございました。さらにこのDataGridView1データをCSVで保存しておき
    次回新たにデータをインプットしたときにCSVで保存するとCSVファイルが上書きされてしまい新たに入力したデータしかCSVファイルに表示されません。
    以前のデータは残していき次行(データ更新の都度)へデータを保存させて行きたいのですがコードがわかりません。勉強中で下記のようなコードを作成してみました。
    ご指導お願いします。
    現行コード
       Public Sub Savedata()
             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
            End If
            For i = 0 To DataGridView1.Columns.Count - 1
                Select Case i
                    Case 0
                        strResult.Append("""" &
                            DataGridView1.Columns(i).HeaderText.ToString & """")
                    Case DataGridView1.Columns.Count - 1
                        strResult.Append("," & """" & DataGridView1.Columns(i).HeaderText.ToString & """" & vbCrLf)
                    Case Else
                        strResult.Append("," & """" & DataGridView1.Columns(i).HeaderText.ToString & """")
                End Select
            Next
            For i = 0 To DataGridView1.Rows.Count - 2
                For j = 0 To DataGridView1.Columns.Count - 2
                    Select Case j
                        Case 0
                            strResult.Append("""" & DataGridView1.Rows(i).Cells(j).Value.ToString & """")
                        Case DataGridView1.Columns.Count - 2
                            strResult.Append("," & """" & DataGridView1.Rows(i).Cells(j).Value.ToString & """" & vbCrLf)
                        Case Else
                            strResult.Append("," & """" & DataGridView1.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 Sub
    2018年5月4日 6:30
  • まず、自分の書かれたコードの意味を100%完全に理解するようにして下さい。他からコードを持ってきてもいいですが、そのコードの意味を100%理解して下さい。

            Dim swText As New System.IO.StreamWriter(strFileName,
                  False, System.Text.Encoding.GetEncoding(932))

    と、書かれていますが、2番目に引数のFalseが何を意味するのかわかりますでしょうか? 答えはそこにあります。

    ファイルにテキストを書き込むには?[C#、VB]
    http://www.atmarkit.co.jp/ait/articles/0711/08/news119.html

    #上記の追加の質問は、このスレッドのタイトルから外れていないと判断しましたが、新たに質問を始める場合は、基本的に新たにスレッドを立てるようにお願いいたします。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年5月4日 6:40
    モデレータ
  • 早速のご指導ありがとうございます。勉強不足を痛感しております、今後も不明なことはご教示いただきたくお願いします。
    2018年5月4日 12:13