選択範囲についてデータグリッドもしくはMSHFlexGridで


ちかし  2004-12-24 18:12:18  No: 87574  IP: [192.*.*.*]

VB6を使っておりまして、ADOでアクセス2000のデータベースをデータグリッドもしくはMSHFlexGridに表示させ、シフトキーやコントロールキーを使って複数行を選択して選択したものを一括削除するようなプログラムを作成しています。
単に表示まではどちらでもできたのですが、上記のような処理を行なうにはどのようにして複数行の値を取得すればよいのでしょうか?

編集 削除
たくみ  2004-12-25 01:11:05  No: 87575  IP: [192.*.*.*]

文面どおり受け止めると、
選択はユーザーが複数行選択済みである、と想定していいんですよね。

それなら、DataGridでしたら、
Dim Bmk As Variant  'ブックマーク用
For Each Bmk In DataGrid1.SelBookmarks
・・・
・・・削除処理
・・・
Next
みたいに
SelBookmarksプロパティを調べて
ループさせればいいだけでは、と思います。

もちろん.Deleteの場合だけでなく、
他のことをやらせたい場面にも応用できると思います。
で、そのコードはどんなのか載せて、、、ということでしょうか。
(DataGridの)SelBookmarksプロパティをヘルプ見れば
ありがたい「そのまんま」のサンプルコードまでありましたよ。

編集 削除
ちかし  2004-12-27 08:35:35  No: 87576  IP: [192.*.*.*]

たくみさんありがとうございます。選択についてですが、DataGridではコントロールキーで複数選択できるんですが、シフトキーはデフォルトの状態では効いていないのですがまずはそこを解決したいです。いろいろプロパティをいじってはいるんですがうまくいきません。逆にMSHFlexGridではプロパティを変更することでシフトキーで複数選択はできるんですが、コントロールキーが効いてないんです。どちらも使いたいので、困っています。

編集 削除
たくみ  2004-12-27 15:41:38  No: 87577  IP: [192.*.*.*]

あ、そういうご質問だったんですね。おもいっきりはずして失礼しました。

> 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

編集 削除