- PR -

DATAGRIDVIEWでコードから(*)の行のセルへ入力

1
投稿者投稿内容
じんたろう
会議室デビュー日: 2007/04/09
投稿数: 8
投稿日時: 2007-04-09 13:55
はじめましてお世話になります。
今までACCESSでやっていたことをVB2005+SQLSEVER2005に移植しようとしています。

Dim VIEW As New DataView
VIEW.Table = Me.DS_予定表.T_予定表 'デザイナで作成しておいたテーブル
DataGridView1.DataSource = VIEW

としてデータを表示させています。(SORT、ROWFILTER 共に使用しています)

この状態であるセルをダブルクリックしたときに特定の文字(コードにより処理)を
そのセルにセットしようとしています。

DGV.BeginEdit(True)
DGV.CurrentCell.Value = "123"
DGV.EndEdit()

すでに追加されているレコードだと正常に更新されますが、
*の行だとセルに値はセットされますが、その行を離れるとセットした値が見えなくなり、
またその行へ戻るとセットした値が見えるといったことになります。
ただ、その状態でDBを再読み込みすると行自体は正常に追加されています。

やりたいこととしてはコードから*の行のセルへ値をセットしても、
通常通りユーザーがキーボードからセルへ値をセットした状態(現在の行が鉛筆マークになり、*の行が1段下に現れる)と同じようにさせる方法はないものでしょうか?

ちなみに
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1041660&SiteID=7
このページのやり方も試してみましたがDATAVIEWを使っているとだめみたいなので
困っています。

よろしくお願いします。


[ メッセージ編集済み 編集者: じんたろう 編集日時 2007-04-09 14:16 ]
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-09 14:38
引用:

じんたろうさんの書き込み (2007-04-09 13:55) より:

http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1041660&SiteID=7
このページのやり方も試してみましたがDATAVIEWを使っているとだめみたいなので
困っています。


リンク先にも書いてありますが、データテーブルの値を直接書き換えましょう。
この場合は DataView の元になっている DataTable に行を追加します。
じんたろう
会議室デビュー日: 2007/04/09
投稿数: 8
投稿日時: 2007-04-09 17:30
KIさん。ありがとうございます。
以下のようにしてやってみました。

If DGV.CurrentRow.IsNewRow Then
Me.T予定表BindingSource.AddNew()
CType(Me.T予定表BindingSource.Current, DataRowView).Row("NO") = "123456"
Me.T予定表BindingSource.EndEdit()
Else
DGV.CurrentCell.Value = "123456"
DGV.EndEdit()
End If

すると*の行のセルで実行すると
1行目は"123456"がセットされたレコード
2行目は空のレコード
と2つレコードが追加されてしまいます。
やはり
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1041660&SiteID=7
DATAVIEWを使わずにこのページのとおりやるしかないんでしょうか?

[ メッセージ編集済み 編集者: じんたろう 編集日時 2007-04-09 17:37 ]

[ メッセージ編集済み 編集者: じんたろう 編集日時 2007-04-09 17:38 ]

[ メッセージ編集済み 編集者: じんたろう 編集日時 2007-04-09 17:42 ]
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-09 18:14
引用:

じんたろうさんの書き込み (2007-04-09 17:30) より:

すると*の行のセルで実行すると
1行目は"123456"がセットされたレコード
2行目は空のレコード
と2つレコードが追加されてしまいます。


デバッガで確認してみればわかりますが、追加行(*の行)にフォーカスがある状態では、
BindingSource の最後に既にレコードが追加されて、そのレコードが編集状態になっています。
そこにさらに AddNew したため2行追加されてしまうのでしょう。
AddNew せずにこれを直接編集すれば2行追加されないと思います。

つまり、「Me.T予定表BindingSource.AddNew()」の一文を省いてみてください。
じんたろう
会議室デビュー日: 2007/04/09
投稿数: 8
投稿日時: 2007-04-09 18:21
たびたびありがとうございます。

CType(Me.T予定表BindingSource.Current, DataRowView).Row("NO") = "123456"
Me.T予定表BindingSource.EndEdit()

にしてやってみましたが Currentが移動していないらしくどのレコード上で
実行しても常に一番古いレコードが編集されてしまいます。

これはDATAGRIDVIEWのDATASOURCEがDATAVIEWになっているからでしょうか?
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-09 19:07
失礼しました。
いまいち DataView を使うとか使わないとかいう表現の意味が
わかっていなかったのですが、ようやく理解できました。
(最初の投稿の読み方が足りませんでした。申し訳ないです。)
BindingSource とか出てきていたので、てっきり BindingSource を
データソースに設定しているものと思い込んでいましたが、
DataView を直接指定しているのですね。
でしたら、バインドされている DataView の AddNew を使う必要があると思います。
AddNew の戻り値として、追加された DataRowView が取得できるので、それに値を設定します。

ちなみに、フィルタ機能もソート機能も BindingSource に用意されていますが、
あえて DataView を自前で作成して使う必要がある状況なのでしょうか?
じんたろう
会議室デビュー日: 2007/04/09
投稿数: 8
投稿日時: 2007-04-10 00:49
KIさんこんばんは。遅くなりました。

VB2005をはじめたばっかりでどの機能を使ってよいかもわからず進んでた状態でしたが
引用:
ちなみに、フィルタ機能もソート機能も BindingSource に用意されていますが、
あえて DataView を自前で作成して使う必要がある状況なのでしょうか?


を読みDataViewをやめてDatagridviewのDatasourceをBindingSourceにしたところ
うまくいきました。

フィルタとソートも
Dataview.Filter="AAA"
Dataview.Sort="AAA"

BindingSource.Filter = "AAA"
BindingSource.Sort = "AAA"
に変えただけでうまくいきました。

「DatagridviewでフィルタやソートをするにはDataviewを使います。」というのを
よく見かけますし、購入した書籍にもそう書いてありましたので
Dataviewばかりにこだわっていました。

ありがとうございました。

[ メッセージ編集済み 編集者: じんたろう 編集日時 2007-04-10 00:50 ]
1

スキルアップ/キャリアアップ(JOB@IT)