DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データバインドされているDataGridViewへの行の追加について

環境/言語:[VB2005 xp ACCESS2000]
分類:[.NET]

アクセスのテーブルとリンクしているDataGridViewに新しい行のデータを挿入したいのですがうまくいきません。

Me.DataGridView1.Rows.Add()を実行しようとすると以下のメッセージが出てしまいます。

コントロールがデータバインドされているとき、DataGridView の行コレクションにプログラムで行を追加することはできません。

データバインドされているDataGridViewはプログラムで行を増やしたり、内容を書き換えたりすることはできないのでしょうか?
■No20365に返信(kenさんの記事)
> データバインドされているDataGridViewはプログラムで行を増やしたり、内容を書き換えたりすることはできないのでしょうか?

バインドしているデータソースに対して行を追加してください。
さらに,オートナンバー型を使っているときには注意すべきことがあります。

ID 値および Autonumber 値の取得
http://msdn2.microsoft.com/ja-jp/library/ks9f57t0(VS.80).aspx
■No20366に返信(シャノンさんの記事)
> ■No20365に返信(kenさんの記事)
>>データバインドされているDataGridViewはプログラムで行を増やしたり、内容を書き換えたりすることはできないのでしょうか?
>
> バインドしているデータソースに対して行を追加してください。

ありがとうございます。

もう一つ教えていただきたいのですが、このDataGridViewの内容を、元のデータベースのテーブルにも反映させるにはどうしたらいいのでしょうか?

DataGridViewの内容を追加したり、変更したりしても、アクセスのテーブルは以前のままなのです。


ありがとうございます。おかげで、データを追加することができました。

もう一つ教えていただきたいのですが、このDataGridViewの内容を、元のデータベースのテーブルにも反映させるにはどうしたらいいのでしょうか?

DataGridViewの内容を追加したり、変更したりしても、アクセスのテーブルは以前のままなのです。
mdbをDataGridView1に読み込んで,Button1で更新する最もシンプルであろうと思われるコードです。
いろいろなTipsページにも同様のものがありますが,参考にしてください。
(例外処理等を必ず加えてください。)

セルの内容を変更し,別の行に移動し,Button1をクリックするとdatabase.mdbの内容を更新します。

Imports System.Data.OleDb

Public Class Form1

    Private cn As OleDbConnection
    Private da As OleDbDataAdapter
    Private ds As DataSet
    Private dt As DataTable
    Private cb As OleDbCommandBuilder
    Private bs As BindingSource

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.cn = New OleDbConnection( _
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=d:\database.mdb;" & _
            "Jet OLEDB:Database Password=;")
        cn.Open()
        Me.da = New OleDbDataAdapter
        Me.ds = New DataSet
        Me.dt = Me.ds.Tables.Add("Table1")
        Me.da.SelectCommand = New OleDbCommand("SELECT * FROM Table1 ORDER BY ID", Me.cn)
        Me.cb = New OleDbCommandBuilder(Me.da)
        Me.da.InsertCommand = Me.cb.GetInsertCommand
        Me.da.UpdateCommand = Me.cb.GetUpdateCommand
        Me.da.DeleteCommand = Me.cb.GetDeleteCommand
        Me.da.Fill(Me.dt)
        Me.bs = New BindingSource
        Me.bs.DataSource = Me.dt
        Me.DataGridView1.DataSource = Me.bs
        AddHandler da.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated) 'オートナンバー型対策
    End Sub

    'オートナンバー型対策
    Private Sub OnRowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs)
        Dim newID As Integer = 0
        Dim idCmd As OleDbCommand = New OleDbCommand("SELECT @@IDENTITY", cn)
        If e.StatementType = StatementType.Insert Then
            newID = CInt(idCmd.ExecuteScalar())
            e.Row("ID") = newID
        End If
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        cn.Close()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.da.Update(dt)
    End Sub

End Class
ありがとうございました。
YAS 軍団さんのプログラムを見ながら自分の思い通りのプログラムを作ることができました。

そこでもう一つ聞きたいのですが、
現在は、アクセスのテーブルをDataGridViewにロードして、そこにデータを書き換えたり、行を追加して新たな内容を書き加えた後に、YAS 軍団さんに作っていただいたプログラムを使って、更新後のDataGridViewの内容をアクセスのテーブルにセーブしています。
ところが、このDataGridViewがテーブルと常に繋がっているせいか(バインドされている)、千回以上の行の挿入を行うと極端に処理が遅くなってしまいます。

データをDataGridViewにロードして、一度、バインドを切って、DataGridView上で作業後、DataGridViewの内容をテーブルにアップデートすることはできますか?
「書き込みのマナーについて」にあるように、一つのスレッドにつき一つの質問でお願いします。

投稿前には必ず「書き込みのマナーについて」をお読みください。

http://dobon.net/vb/bbs/index.html
申し訳ございませんでした。
以降、気をつけます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板