VB6を使っておりまして、ADOでアクセス2000のデータベースをデータグリッドもしくはMSHFlexGridに表示させ、シフトキーやコントロールキーを使って複数行を選択して選択したものを一括削除するようなプログラムを作成しています。
単に表示まではどちらでもできたのですが、上記のような処理を行なうにはどのようにして複数行の値を取得すればよいのでしょうか?
文面どおり受け止めると、
選択はユーザーが複数行選択済みである、と想定していいんですよね。
それなら、DataGridでしたら、
Dim Bmk As Variant 'ブックマーク用
For Each Bmk In DataGrid1.SelBookmarks
・・・
・・・削除処理
・・・
Next
みたいに
SelBookmarksプロパティを調べて
ループさせればいいだけでは、と思います。
もちろん.Deleteの場合だけでなく、
他のことをやらせたい場面にも応用できると思います。
で、そのコードはどんなのか載せて、、、ということでしょうか。
(DataGridの)SelBookmarksプロパティをヘルプ見れば
ありがたい「そのまんま」のサンプルコードまでありましたよ。
たくみさんありがとうございます。選択についてですが、DataGridではコントロールキーで複数選択できるんですが、シフトキーはデフォルトの状態では効いていないのですがまずはそこを解決したいです。いろいろプロパティをいじってはいるんですがうまくいきません。逆にMSHFlexGridではプロパティを変更することでシフトキーで複数選択はできるんですが、コントロールキーが効いてないんです。どちらも使いたいので、困っています。
編集 削除あ、そういうご質問だったんですね。おもいっきりはずして失礼しました。
> DataGridでは・・・シフトキーはデフォルトの状態では効いていないので
これって仕様かと思ってましたが?(根拠はないです)
でもお気持ちはちょっとわかります。
で、そこの機能むりやり自作されるのなら、
(たぶんとっくにやられてみたけどうまくいかない、のかも知れませんが)
DataGridのKeyDownイベントの引数(KeyCode As Integer, Shift As Integer)
を使い、そのイベント内で、シフトキーが押されたのかIf文で調べて
シフトキーなら処理をする、ってのは駄目ですか?
下記にそのイメージのコードを書いておきます。
※ただし、このコードはみてのとおり悲しいかなカレントレコードの
1レコードしか選択してくれませんので、複数選択の場合もこの考えで
いけるかどうかを保障するものではありませんが。
'(注意)DataGridコントロール名がGridDataでかつ
'いっしょに使用しているADODCコントロール名をAdoDataとします。
Private Sub GridData_KeyDown(KeyCode As Integer, Shift As Integer)
If Not (KeyCode = vbKeyShift) Then Exit Sub
Dim RsGrid As ADODB.Recordset 'グリッドの表示上の内容のレコードセット用
Set RsGrid = Me.AdoData.Recordset
If RsGrid.EOF = True Then Exit Sub
GridData.SelBookmarks.Add RsGrid.Bookmark '強制的に今いる行の1レコードを選択する
'ちゃんと1レコード選択されたかを見るテスト
If Not (1 = GridData.SelBookmarks.Count) Then
MsgBox "No Selected"
Exit Sub
Else
MsgBox "Selected"
End If
End Sub