DataGridViewでAccessと同じように

タグの編集
投稿者 hoido  (社会人) 投稿日時 2010/7/15 02:19:25
いつもお世話になっております。
早速ですが
テーブル1
 SDID,SD
   1,A
       2,B

テーブル2
 SDID,入力日
     1,2010/7/1

クエリ
 SDID,SD,入力日
   1,A,2010/7/1

SQL内容
 SELECT テーブル2.SDID, テーブル1.SD, テーブル2.入力日
 FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.SDID = テーブル2.SDID;

ACCESSの選択クエリで上記に様に記載し、選択クエリにて”SDID”を入力すれば自動的に”SD”が表示されます。
この動作をVB2008Express+SQLServer2005Expressの環境でDataGridViewで行いたいのです。
実際
Dim Cn As SqlConnection = New SqlConnection(MainServer)
Dim SQLCm As SqlCommand = Cn.CreateCommand
Dim Adapter As New SqlDataAdapter(SQLCm)
Dim Table As New DataTable
SQLCm.CommandText =  "SELECT テーブル2.SDID, テーブル1.SD, テーブル2.入力日
 FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.SDID = テーブル2.SDID"
Adapter.Fill(Table)
DataGridView1.DataSource = Table
Table.Dispose()
Adapter.Dispose()
SQLCm.Dispose()
Cn.Dispose()
と記載しても表示されません。
一度SQLServerに保存後再表示すれば問題なく表示されるのですが、”SDID”入力後すぐ表示させるようには出来ないものでしょうか?
ご教授お願いいたします。
 
投稿者 るきお  (社会人) 投稿日時 2010/7/15 13:21:07
こんにちは。
状況に少しわからない部分があります。

hoidoさんは、VB2008で
①データベースを読み込んでDataGridViewに表示するプログラム
を作ったのですよね?
それで、①実行後、ユーザーが
②DataGridViewをマウスやキーボードを使って編集する
んですね?
そのあと、ユーザーの編集内容をSQL Serverに保存するプログラムは実行しないで
また、
①のデータベースを読み込むプログラムを実行すると、
ユーザーが②で編集した内容がなかったことになっている。

こういうことでよいでしょうか?

そして、知りたいことは2回目の①実行時にユーザーが編集した内容が反映されるようにしたいということですね?

Accessの選択クエリをExcelのようなエディター(?)で開いた場合は編集した内容が即座にデータベースに反映されるので、わざわざデータを保存するプログラムを別途実行しなくても、
またエディター(?)を開くと編集内容が表示されるので、VBでも同じようにできないか考えているということですよね?

私の想定が正しければ
Accessの選択クエリが読み書きしているのはデータベースであるのに対し、
VBのDataGridViewが読み書きしているのはDataTableであるので、
(そうでないようにすることもできますが)
VBの場合、データベースに保存せずにデータベースから再読み込みするとおっしゃるようにどうしても編集内容はなくなってしまいますが、
DataTableから再読み込み(というか表示)するようにすれば、Accessと同じように編集内容が即座に反映された形になります。
投稿者 hoido  (社会人) 投稿日時 2010/7/15 19:24:09
るきお様回答ありがとうございます。
実際行いたい処理は

 SDID,SD
   1
上記のようにDataGridViewのSDIDのセルにSDIDに数値を入力すると
 SDID,SD
   1,A
上記のようにSDが入力後すぐSDが表示されるというものです。

るきお様のおっしゃられるとおり
>Accessの選択クエリが読み書きしているのはデータベースであるのに対し、
>VBのDataGridViewが読み書きしているのはDataTableであるので、
というのはなんとなくわかるのですが解決するためのコードが全然思いつきません。
やはりSDID入力→データベース保存→DataGridViewの再表示これが一般的なのでしょうか?
それともAccessの様な処理は可能なのでしょうか?
今一度ご教授願います。


投稿者 るきお  (社会人) 投稿日時 2010/7/15 20:21:37
こんにちは。

状況がよくわからないです。

>SDID,SD
>   1
>上記のようにDataGridViewのSDIDのセルにSDIDに数値を入力すると
> SDID,SD
>   1,A
>上記のようにSDが入力後すぐSDが表示されるというものです。
入力したら当然表示されますよね?
メモ帳でもなんでも「A」と入力すれば「A」と表示されますよね?

まさか、入力したら消すというプログラムになっているとも思えないですし、
それで前の投稿のようにプログラムの流れを聞きました。

ひょっとするとパソコンが2台あって、片方で入力したらすぐにもう片方に表示されるというようなことでしょうか?
投稿者 るきお  (社会人) 投稿日時 2010/7/15 20:23:34
追記します。

>やはりSDID入力→データベース保存→DataGridViewの再表示これが一般的なのでしょうか?
それともAccessの様な処理は可能なのでしょうか?
状況がよくわからないのでお答えできないです。

私の想定での回答は最初の投稿の「私の想定が正しければ」以下に書きました。
想定が間違っていれば、どういう流れになっているのか教えていただければなにか役に立てるかもしれません。
投稿者 るきお  (社会人) 投稿日時 2010/7/15 20:48:12
ごめんなさい。1個はやとちりして回答してしまいました。

>SDID,SD
>   1
>上記のようにDataGridViewのSDIDのセルにSDIDに数値を入力すると
> SDID,SD
>   1,A
>上記のようにSDが入力後すぐSDが表示されるというものです。
この部分、2つ上の私の回答はなかったことにさせてください。

それでも、やはりわからなくて、ちょっと仕切りなおしさせてください。

どういう順番に何をする想定なのかを教えてください。
それで、どこかのステップで期待することができていないということと思いますが、そのステップでどうなることを期待しているのか書いていただくことはできますか?


1.クエリの内容をDataGridViewに表示する
2.ユーザーがDataGridViewの最後SDID「1」、SD「A」の行を入力して追加する。
3.別のパソコンで同じプログラムを実行し、同じようにクエリの内容をDataGridViewに表示する。
4.ここでSDID「1」、SD「A」の行が表示されない。これが表示されるようにしたい。
投稿者 hoido  (社会人) 投稿日時 2010/7/15 21:13:27
るきお様回答ありがとうございます。
私の質問の仕方が下手ですみません。

処理内容
①テーブル1とテーブル2を準備します
②テーブル1とテーブル2をするSQLを作成
 SQL内容
  SELECT テーブル2.SDID, テーブル1.SD, テーブル2.入力日
  FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.SDID = テーブル2.SDID
③SQL結果をDataTableおよびDataGridViewに表示
 表示結果 SDID : SD : 入力日
④DataGridViewにデータ入力
 ※入力項目はSDIDと入力日のみでSDは入力しません

Accessの場合るきお様のおっしゃられるとおり
>Accessの選択クエリが読み書きしているのはデータベースであるのに
であるから選択クエリでSDIDを入力すればテーブル1とテーブル2がSDIDで関連付けされているため、SDをわざわざ入力することなく自動で表示されます。
しかし、
>VBのDataGridViewが読み書きしているのはDataTableであるので、
ということだと思うのですがDataGridViewではSDIDを入力してもSDには何も入力されません
※一度保存後再度表示すれば別ですが

私が希望としている動作はAccessのような動作です。

そもそも私が
Dim Cn As SqlConnection = New SqlConnection(MainServer)
Dim SQLCm As SqlCommand = Cn.CreateCommand
Dim Adapter As New SqlDataAdapter(SQLCm)
Dim Table As New DataTable
SQLCm.CommandText =  "SELECT テーブル2.SDID, テーブル1.SD, テーブル2.入力日
 FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.SDID = テーブル2.SDID"
Adapter.Fill(Table)
DataGridView1.DataSource = Table
Table.Dispose()
Adapter.Dispose()
SQLCm.Dispose()
Cn.Dispose()
のコードを記載しているイベントの場所が悪いのでしょうか?
今はフォームLoadイベント内に記載しています
Private Sub Frm_Try_Load ・・・
 上記コード
End Sub

質問の仕方がわるくご迷惑をおかけしておりますが、どうぞよろしくお願いいたします。
投稿者 るきお  (社会人) 投稿日時 2010/7/15 21:42:50
いえいえ。私の読解力のなさを痛感しています。

③でSQL結果を表示しているのに、また④に入力するというのがよくわからないです。
同じものを入力するのが2か所ある画面なんですか?

>のコードを記載しているイベントの場所が悪いのでしょうか?
悪くないです。

Accessでも何もしないで自動的に表示されるわけではなく、
(最近Accessを使ってないので忘れてしまいましたが)
なにかテキストボックスにプロパティを設定するからこそ連動して表示されますよね?

VBでテキストボックスをTableなどのデータソースに連結するには次のように書きます。
txtSD.DataBindings.Add("Text", table, "SD")

この例では、txtSDのTextプロパティに自動的に現在選択されているレコードのSD列の値を表示します。

まだ、ずばりの回答にはなっていないと思いますが、多少近づけましたか?

考えたのですが、
>私が希望としている動作はAccessのような動作です。
これが理解しにくい原因かもしれません。
「Accessのような動作」と言われてもAccessもプログラムや設定次第で動作がいろいろ変わります。
Accessという言葉を使わないで説明した方がわかりがいいかと思います。
投稿者 るきお  (社会人) 投稿日時 2010/7/15 22:02:41
追伸です。

こんなこともできますよ。
http://homepage1.nifty.com/rucio/main/VBdotNet/Database/Database7.htm

Accessのイメージにちょっと近いです。