DataGridViewでの変更内容をDataSetに反映させるには?

解決


やんやん  2006-06-14 05:03:22  No: 131839

はじめまして、やんやんと申します。
http://hpcgi1.nifty.com/rucio/mb1/mb1.cgi
でも質問したのですが、どうしてもわからないので質問させて下さい。

環境はVB.NET2005、SQL Server 2005です。

データセットの内容をデータビューを介してデータグリッドビューに渡してデータセットの内容を表示させています。
例えば以下の通り。(省略して書きます)
---
Dim dataset<商品名> As DataSet = New DataSet("T_<商品名>")
Dim dataview<商品名> As DataView
Dim datagridview<商品名> As DataGridView

dataview<商品名> = New DataView(dataset<商品名>.Tables("T_<商品名>"), _
"<顧客ID> = '" & ID & "'", "<顧客ID>", DataViewRowState.CurrentRows)

datagridview<商品名>.DataSource = dataview<商品名>
---
商品は色々あり、顧客はどの商品をいくつ買ったかをデータセットで持っています(データベース上にも)。
上記のようにデータグリッドビューで顧客ごとの各商品の購入内容を表示させています。
ここで、商品の購入内容に変更(追加や削除、変更など)があった場合、データグリッドビューで表示されている部分を修正します。
この修正をデータセットというかデータベースに反映させたいのです。

現状では
---
dataview<商品名> = datagridview<商品名>.DataSource
---
としてデータビューに状態を入れ?て何とか処理しようとしています。
これは間違いなのでしょうか?
というか、どうすればいいのかわかりません。

VB中学校様ではデータビューについて
http://msdn.microsoft.com/library/ja/cpguide/html/cpconCreatingUsingDataViews.asp
をじっくり読んでみましょうといわれ読んだのですが、どうしてもわかりません。

どなたか教えていただけないでしょうか?
宜しくお願い致します。


特攻隊長まるるう  2006-06-14 05:52:34  No: 131840

# 2005はまだ触ったこと無いですがw

大前提としてADO.NETはデータベースと非連結ですので
まずは、ローカルのデータのみの変更になると思います。
データベースの変更が、SQL Server の変更を意味するなら、
また、別の話です。
[@IT ADO.NET基礎講座]
http://www.atmarkit.co.jp/fdotnet/basics/adonet_index/index.html

>VB中学校様ではデータビューについて
>http://msdn.microsoft.com/library/ja/cpguide/html/cpconCreatingUsingDataViews.asp
>をじっくり読んでみましょうといわれ読んだのですが、どうしてもわかりません。
ざっと読んでみたけど、
>このセクションの内容
>  DataView を使用したデータの変更
っていう分かり易いリンクがあって、リンク先には
>AllowEdit が true の場合は、DataRowView を使用すると DataRow の内容を変更できます。
って書いてあるね。サンプルコードも載ってる。。。

じっくり3回くらい声に出して読めば分かったんじゃない?(^^)


やんやん  2006-06-14 22:18:11  No: 131841

お返事頂きありがとうございます。

>このセクションの内容
>  DataView を使用したデータの変更

ここは読みましたが、分からなかったので質問いたしました。
データ更新時は更新ボタンがあって、そのタイミングで個々のデータを更新するようにしています。
そして、現在データグリッドビューで変更があったかもしれない商品の状態を上述したように
---
dataview<商品名> = datagridview<商品名>.DataSource
---
としてデータビューに状態を入れ?て何とか処理しようとしています。
この時点ではデータビューとデータテーブルやデータセットとはつながりがない状態に思います。
この場合、つながりを持たせるにはどうしたらよいのでしょうか?
dataset<商品名>.Tables("T_<商品名>") = dataview.Table
としようとすると、dataset<商品名>.Tables("T_<商品名>")がReadOnlyだといわれてしまいます。

すみませんが宜しくお願い致します。


特攻隊長まるるう  2006-06-14 23:24:56  No: 131842

もう一度読んでください。
>AllowEdit が true の場合は、DataRowView を使用すると DataRow の内容を変更できます。
DataView と DataRowView は違うものです。サンプルコードがあるのに無視しないでください。


やんやん  2006-06-15 01:10:45  No: 131843

早速お返事ありがとうございます。
申し訳ございません。
ソースコードを無視したわけではありません。
先のコードでは、コード内でデータの変更を行なっていて、私がやりたいのは、DataGridView内で変更を行なったデータに対しての操作だったからです。
もう少し読み込んで色々と試してみます。
すみませんでした。


やんやん  2006-06-15 01:17:48  No: 131844

すみません、追記です。
追加にはAddNew()が、削除にはDelete()があるのに、変更には適当なメソッドがありません、DataViewには。
こういう場合どう処理すればよいのでしょうか?
DataRowView.EndEditを呼び出せばよいだけなのでしょうか?
そしてDelete()ではインデックスの値を求められますが、値を入れても「式は値を生成しません」と出てしまいます…
これは何がいけないのでしょうか?

すみませんがご教授頂ければ幸いです。


特攻隊長まるるう  2006-06-15 01:34:28  No: 131845

ああ。。。何をしたいのかが不明です。
仕方が無いので『Visual Basic 中学校』さんの過去ログ(?)を
ず〜っと読んできました。
 # 掲示板変わったら、最初から説明しないと分からないよ。。。
 # 結論として、仰るとおり、 DataView 関係ないかも?(^^;)
>投稿者   やんやん   タイトル   1つ解決しましたが、また疑問が…
>2006年6月8日(木) 18:4:36
>
>dataadapter.Update(dataset,"T_<商品名>") 
>こうしても、データの変更がデータベースに反映されないのです。 

これが大元ですね?(^^;)
既にリンクしております下記サイトの情報に目を通してください。
[@IT ADO.NET基礎講座]
http://www.atmarkit.co.jp/fdotnet/basics/adonet_index/index.html

>第5回  データセットを使ったレコードの追加(2003/12/10)  
> 1.レコードの追加とInsertCommandプロパティ
Insert するときは InsertCommand の設定が必要で、
Update するときは UpdateCommand の設定が必要です。
これが設定されていないと[VB.NET2003]だとエラーも出ずに、
何も処理されなかったです。


やんやん  2006-06-15 04:51:27  No: 131846

ご迷惑をおかけしております、申し訳ございません。
Visual Basic中学校様の過去ログまでご覧頂き誠に恐縮です。
最初に書いた内容で伝わると思っておりましたが、私の認識不足でご迷惑をおかけし、申し訳ございません。

UpdateCommandの設定はしております。
実際には
sCom = New SqlClient.SqlCommandBuilder(adapet<商品名>)
adapter<商品名>.Update(Dataset<商品名>,"T_<商品名>")

こうしていても、DataGridView上に表示させてあるデータを変更しても、変更が反映されません。
2005でも同様にエラーも出ずに何も処理されません。

DataGridView上にデータを表示するには、以下のようにしています。
---
cmd<商品名> = New SqlClient.SqlCommand("SELECT * FROM <商品名> WHERE <顧客ID> = '" & ID & "'", scn)
adapter<商品名>.SelectCommand = cmd<商品名>
adapter<商品名>.Fill(datset<商品名>, "T_<商品名>")
dataview<商品名> = New DataView(dataset<商品名>.Tables("T_PreviewNews"), "<顧客ID> = '" & ID & "'", "<顧客ID>", DataViewRowState.CurrentRows)

DataGridView<商品名>.DataSource = dataview<商品名>
---
個々の顧客毎にその顧客が購入している商品を表示するようにしています。
ここで、上記のように顧客を条件として表示内容を制限?すると、変更内容が反映されません。
これが、条件をつけずに全顧客の全商品を表示させると、変更内容が反映されます。

また、以下のようにUpdateする前にデータを処理しようとしてプログラムを組んだのですが、
---
dataview<商品名> = DataGridView<商品名>.DataSource

If dbnull0 IsNot dataview<商品名>.Table.Rows(ID) Then←(A)

   Dim newrow<商品名> As DataRow = table<商品名>.NewRow()

   newrow<商品名>("<顧客ID>") = dataview<商品名>.Table.Rows(ID)("<顧客ID>")
                      ・
                      ・
                      ・

   table<商品名>.Rows.Add(newrow<商品名>)

ElseIf DataRowState.Deleted = dataview<商品名>.Table.Rows(ID).RowState Then

   adapter<商品名> = New SqlClient.SqlDataAdapter("DELETE FROM <商品名> WHERE <顧客ID> = '" & ID & "'", scn)
   adapter<商品名>.Fill(dataset<商品名>, "T_<商品名>")

Else

    DsetNews.tables("T_<商品名>").Rows(ID)("<買った日>") = dviewnews.Table.Rows(ID)("買った日")
                    ・
                    ・
                    ・

End If
---
新規追加の場合、(A)で「行<ID>に値がありません」とエラーになってしまいます。
削除や変更のときは試していません。

DataGridViewに入力された値を拾ってきてプログラム側でデータセット等に入力し、データの変更を反映させたいのですが、どのように刷ればよろしいでしょうか?
ご教授頂ければ幸いです。
#もう半月も悩んでます…

宜しくお願いいたします。


やんやん  2006-06-15 05:05:19  No: 131847

すみません、間違いです。

>新規追加の場合、(A)で「行<ID>に値がありません」とエラーになってしまいます。

正しくは
>新規追加の場合、(A)で「位置<ID>に行がありません」とエラーになってしまいます。

です。

単純にDataGridViewに表示されているデータの値の変更をデータセット等に反映させたいだけなのですが…
どなたかご教授下さい。


やんやん  2006-06-16 01:02:29  No: 131848

ご紹介頂いた一連のサイトを拝見し、UpdateするまえにデータセットをFillすればいいのかと思ってやってみましたが、見た目には反映されているように表示されますが、ソフトを再起動するとまったく反映されていません。
Fillでもだめなのでしょうか???


やんやん  2006-06-16 05:15:45  No: 131849

たびたびすみません。
---
[@IT ADO.NET基礎講座]
http://www.atmarkit.co.jp/fdotnet/basics/adonet_index/index.html

>第5回  データセットを使ったレコードの追加(2003/12/10)  
> 1.レコードの追加とInsertCommandプロパティ
---
に書かれてある「コマンド自動作成」のSqlCommandBuilderを上述のように利用しております。
これをしようとすると、既存のデータをアップデートしようとするとUpdateではなくInsertしようとしてしまいます。
InsertではなくUpdate使用とする場合はどうすればよいのでしょうか?
どなたかご教授頂ければ幸いです。


特攻隊長まるるう  2006-06-16 18:47:54  No: 131850

プログラムはヘルプに書いてある通りの動作しかしません。

質問が幾つかの方向に枝分かれしてて、何に対して
どう対策したか?その結果をどういう手段で確認したか?
十分に書かれていなくて、どの問題について言っているのか?
…申し訳ないですが、ボクの力では理解できませんでした。

問題点を切り分けることをお勧めします。

>UpdateするまえにデータセットをFillすればいいのかと思ってやってみましたが
[DbDataAdapter.Fill メソッド]
http://msdn2.microsoft.com/ja-jp/library/system.data.common.dbdataadapter.fill.aspx
データを読み込むだけなので、何が目的か?何故必要なのか?
どこが問題なのか?分かりませんでした。


やんやん  2006-06-16 19:45:24  No: 131851

お騒がせしました。
自力で解決しました。
きちんと値がセットできてなかったようです。
すみませんでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加