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

DataGridViewへの行の追加について

環境/言語:[VS2005 C# WindowsXP ACCESS2000]
分類:[.NET]

Acccessデータベースとの連携プログラム作成初心者です。過去ログに同様な記事があったのですが、意味が分からず、途方に暮れています。
やりたいことは、AccessのテーブルとリンクしているDataGridViewに新しい行のデータを挿入し、またその結果をAccessに反映したいのですがうまくいきません。DataGridView.Rows.Add()を発行すると、以下のエラーとなってしまいます。

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

そもそもDataGridViewはプログラムで行を増やしたり、内容を書き換えたりすることはできないのでしょうか?コントロールがデータバインドされているとはどういう意味なのでしょうか?過去ログでは、「バインドしているデータソースに対して行を追加してください。」とありましたが、まったく意味がわかりません。参考までに見にくく汚いプログラムですが私の書いたものを載せておきます。

どうかどなたかご教授のほどをよろしくお願いいたします。
---------------------------------------------------------------------------
DataSet dtSet;
OleDbDataAdapter dAdapter;
//-------------------------------------------------------------------------
// フォームロード時の処理を行うルーチン
//-------------------------------------------------------------------------
private void FrmSyaryou_Load(object sender, EventArgs e) {
//-------------------------------------------------------------------------
// 表示するグリッド幅をDataGridViewの幅いっぱいまで広げる
//-------------------------------------------------------------------------
dGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
//-------------------------------------------------------------------------
// 列を追加表示する
//-------------------------------------------------------------------------
dGridView.Columns.Clear();
dGridView.Columns.Add("区分", "区分");

//-------------------------------------------------------------------------
// 接続文字列の生成とコネクションの生成
//-------------------------------------------------------------------------
String connString =
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + sb.ToString() + "\\利用中止車両データ.mdb";/* +
"Initial Catalog=利用中止車両データ.mdb";*/
OleDbConnection dbConnect = new OleDbConnection(connString);
try {
//-------------------------------------------------------------------------
// DBからのデータの読み出しとグリッドへの表示
//-------------------------------------------------------------------------
OleDbCommand dbCommand = new OleDbCommand();

//-------------------------------------------------------------------------
// コネクションのOleDbCommandオブジェクトへの設定
//-------------------------------------------------------------------------
dbCommand.Connection = dbConnect;

//-------------------------------------------------------------------------
// データセットを生成しOleDbDataAdapterのSelectCommandプロパティにSQL文を設定する
//-------------------------------------------------------------------------
dtSet = new DataSet("利用中止車両データ");
dAdapter = new OleDbDataAdapter("SELECT 機種, 型式, 機番 FROM 利用中止車両データ", dbConnect);

//-------------------------------------------------------------------------
// コネクションのオープン
//-------------------------------------------------------------------------
dbConnect.Open();

//-------------------------------------------------------------------------
// データセットにデータを取得する
//-------------------------------------------------------------------------
dAdapter.Fill(dtSet, "利用中止車両データ");

//-------------------------------------------------------------------------
// DataGridViewのデータソースにデータを表示
//-------------------------------------------------------------------------
dGridView.DataSource = dtSet.Tables[0];

//-------------------------------------------------------------------------
// 列の幅を調節し、各列の値を読み取り専用に設定する
//-------------------------------------------------------------------------
dGridView.Columns[0].Width = 60;
dGridView.Columns["区分"].ReadOnly = true;
dGridView.Columns["機種"].ReadOnly = true;
dGridView.Columns["型式"].ReadOnly = true;
dGridView.Columns["機番"].ReadOnly = true;

//-------------------------------------------------------------------------
// DataGridViewのセルを選択することで行全体が選択されるようにする
//-------------------------------------------------------------------------
dGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

//-------------------------------------------------------------------------
// DataGridViewで複数行が選択できないようにする
//-------------------------------------------------------------------------
dGridView.MultiSelect = false;

//-------------------------------------------------------------------------
// 奇数行の背景色にLightBlueを指定
//-------------------------------------------------------------------------
dGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue;

//-------------------------------------------------------------------------
// テキストボックスに文字入力時のIMEModeをOFF固定にする
//-------------------------------------------------------------------------
ctxtKisyu.ImeMode = ImeMode.Off;
ctxtKatashiki.ImeMode = ImeMode.Off;
ctxtKiban.ImeMode = ImeMode.Off;

//-------------------------------------------------------------------------
// SQL文の設定
//-------------------------------------------------------------------------
dbCommand.CommandText = "SELECT 機種, 型式, 機番 FROM 利用中止車両データ";

//-------------------------------------------------------------------------
// Accessデータベースから1列ごとにデータを取得する
//-------------------------------------------------------------------------
OleDbDataReader reader = dbCommand.ExecuteReader();
int counter = 0;
while (reader.Read()) {
counter++;
}
//-------------------------------------------------------------------------
// ラベルを3桁毎のカンマ区切りで表示するためにToString()に引数をつける
//-------------------------------------------------------------------------
lblDataKensuu.Text = "データ件数:" + counter.ToString("#,#") + "件";
}
catch (Exception equery) {
MessageBox.Show(equery.Message);
dbConnect.Close();
}
}

private void cmdAdd_Click(object sender, EventArgs e)
{
try {
dGridView.DataSource = dGridView.Rows.Add(ctxtKisyu.Text, ctxtKatashiki.Text, ctxtKiban.Text);
dAdapter.Update(dtSet, "利用中止車両データ");
}
catch (Exception ecmdaddclick) {
MessageBox.Show(ecmdaddclick.Message);
}
}
> そもそもDataGridViewはプログラムで行を増やしたり、内容を書き換えたりすることはできないのでしょうか?コントロールがデータバインドされているとはどういう意味なのでしょうか?過去ログでは、「バインドしているデータソースに対して行を追加してください。」とありましたが、まったく意味がわかりません。

コントロールにデータがバインドしているとは、この場合、DataGridViewというコントロールにAccessのデータが結びついているということです。そのため、DataGridViewの方で勝手に行を追加することはできません。

DataGridView
|
BindingSource
|
DataTable
|
Access(mdb)

のような構造になっているはずです。データソースに対して行を追加するというのは、DataTableに対して行を追加することになります。BindingSourceはデータソース(この場合はDataTable)をラップしているようなものであり、データソースを統一的に楽に取り扱えるようにしたものです。したがって、BindingSourceを利用して行を追加されると良いでしょう。
■No21033に返信(trapemiyaさんの記事)
>>そもそもDataGridViewはプログラムで行を増やしたり、内容を書き換えたりすることはできないのでしょうか?コントロールがデータバインドされているとはどういう意味なのでしょうか?過去ログでは、「バインドしているデータソースに対して行を追加してください。」とありましたが、まったく意味がわかりません。
>
> コントロールにデータがバインドしているとは、この場合、DataGridViewというコントロールにAccessのデータが結びついているということです。そのため、DataGridViewの方で勝手に行を追加することはできません。
>
> DataGridView
> |
> BindingSource
> |
> DataTable
> |
> Access(mdb)
>
> のような構造になっているはずです。データソースに対して行を追加するというのは、DataTableに対して行を追加することになります。BindingSourceはデータソース(この場合はDataTable)をラップしているようなものであり、データソースを統一的に楽に取り扱えるようにしたものです。したがって、BindingSourceを利用して行を追加されると良いでしょう。

フォームにBindingSourceを追加して、そのDataSourceプロパティにDataAdapterで取得してDataSetに設定したAccessのデータをDataAdapter.Fillで指定するようにしました。ここまでは合っているでしょうか?その後、以下のように

bindingSource.DataSource = dGridView.Rows.Add(ctxtKisyu.Text, ctxtKatashiki.Text, ctxtKiban.Text);
dGridView.Update();

行を追加してみたのですが、やはり「コントロールがデータバインドされているとき、DataGridViewの行コレクションにプログラムで行を追加することはできません。」と同じエラーが出ます。
スレッドを起こした時に、ソースを載せてありますので、具体的にどこがどう悪いのかご指摘いただけませんでしょうか?もしくは簡単なサンプルコードを示していただけませんでしょうか?この処理だけで丸2日かかってしまい、途方に暮れております。どうかよろしくお願いいたします。
この投稿はマルチポストです。

●マルチポストされている場所
http://vsug.jp/tabid/63/forumid/72/postid/10539/view/topic/Default.aspx

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
■No21036に返信((報告)さんの記事)
> この投稿はマルチポストです。
>
> ●マルチポストされている場所
> http://vsug.jp/tabid/63/forumid/72/postid/10539/view/topic/Default.aspx
>
> ----------
> この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。
>
> ●書き込みのマナーについて
> http://dobon.net/vb/bbs/index.html

大変申し訳ありませんでした。確かにこの記事はマルチポストに当たります。
この掲示板で問題が解決せず、また急いでいたため報告にあるように
別な掲示板にも同様の内容で記事を載せてしまいました。
本当に申し訳ありませんでした。

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