度々失礼します。くろねこと申します。
環境:Win2000 VB6.0 SP5
MicroSoft DataGridで、ある行をクリックした時にその行をハイライト表示する処理を書いています。
DataGrid上に見えている分部をクリックしハイライト表示を行うことは出来たのですが、隠れている分部(スクロールバーで下に移動して表示される分部)をクリックした時に、その行とは別の行がハイライト表示されてしまいます。
例えば、DataGridに50行分のデータを追加し、実際に画面に見えている分部は30行までとします。スクロールバーで下に移動し40行目をクリックすると、なぜか26行目がハイライト表示されるのです。
以下にコードを載せます。なにかよろしくないことをしているのでしょうか?
ちなみに、隠れた分部をクリックした時の「DataGrid1.Row」が既に違った値になっていました。
----------------------------------------------------------------------
Dim rs As New ADODB.Recordset
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
Dim lRow As Long
' 指定されたRowの値を取得
lRow = DataGrid1.Row
' あらかじめコレクションにセットされているブックマークを削除します
While (DataGrid1.SelBookmarks.Count <> 0)
DataGrid1.SelBookmarks.Remove 0
Wend
' 指定された位置に移動
Call rs.MoveFirst
Call rs.Move(lRow)
' 選択した行のブックマークをコレクションに追加します
DataGrid1.SelBookmarks.Add rs.Bookmark
End Sub
----------------------------------------------------------------------
以上。よろしくお願いいたします。
> ' 指定されたRowの値を取得
> lRow = DataGrid1.Row
Rowプロパティは、グリッド上で「見えている範囲」の一番上を 0 とします。
# Recordset.AbsolutePositionとは異なり、「データの先頭行」から
# 数えられているわけでは無いので、注意してください。
> Call RS.MoveFirst
> Call RS.Move(lRow)
DataGridにバインドしているのであれば、RS側のカーソル位置も
連動して変化しますから、わざわざMove系メソッドを使う必要は
無いと思いますよ。
もし、RSというのがバインドさせているRecordsetそのものではなく、
Cloneであるとしても、Move系メソッドを使うより、
Bookmarkプロパティを使って移動させた方が確実かと。
魔界の仮面弁士様、お返事ありがとうございます。
Recordset.AbsolutePosition確認をしました。
ちゃんと選択行が入っていました。
>DataGridにバインドしているのであれば、RS側のカーソル位置も
>連動して変化しますから、わざわざMove系メソッドを使う必要は
>無いと思いますよ。
選択行をハイライト表示するだけですと、
DataGrid1.SelBookmarks.Add rs.Bookmark
だけでいいんですね・・・。勉強になります。
マイクロソフトのサポートのハイライト表示関連で
Move系メソッドを利用していたのでこの処理を入れていたのですが、いらないみたいですね。
ツイート | ![]() |