リストボックスでstyleをチェックボックス型にした場合に□を押すとチェックがつきますが、文字の部分は2回押さないと□にチェックがつかないです。
なんとか文字の部分も1回チェックしただけでつくようになりませんか?
Clickイベント中でSelectedプロパティを反転させるとか。
プロシージャへの再入を阻むことと、カーソルの位置によっては
無視すること、に気をつければ問題なく実装できるでしょう。
MouseDownの時に
lst.Selected(listindex) = True
のようにしてみたら、文字の部分を押してもチェックがついたり、はずせたりするようになったのですが、
□→■→□(□がチェックしてない状態、■がチェックしている状態)
の順に押すと、3番目のチェックが外れた状態から押しても反応が全くなくなりました。
一度他の部分を押してからだとチェックが入るのですが、同じ行を連続で押すときちんと動かないです。
対処法はありますか?
なぜ、Trueに固定決めうちなのでしょう?
それと適切に再入を阻んでいます?
Falseもやってますよ。
押されてる状態ならFalseにして、押されていない状態ならTrueにしてます。
こんな感じでいいのでは?
Option Explicit
Private OldIndex As Integer
Private Sub Form_Load()
List1.Clear
List1.AddItem "123"
List1.AddItem "456"
List1.AddItem "789"
List1.ListIndex = 0
OldIndex = 0
End Sub
Private Sub List1_Click()
If List1.ListIndex = OldIndex Then Exit Sub
List1.Selected(List1.ListIndex) = Not List1.Selected(List1.ListIndex)
End Sub
Private Sub List1_ItemCheck(Item As Integer)
OldIndex = Item
End Sub
ちょっと補足。
リストボックスで選択されている行(青くなっている行)は
文字の部分をクリックしても□にチェックがつきますが
選択されている行じゃない行は、文字の部分をクリックすると
選択されるだけです。
この状態でもう一回クリックすると、上の、選択されている行の
文字をクリックするのと同じ動作なので、□にチェックがつきます
というわけで、選択されている行とは違う行をクリックした時だけ
チェックの値を反転させれば良いです。
その処理を追加した場合、lst.selected(i)=trueみたいな感じにするとClickイベントにいきませんか?
□をチェックしたときも、ItemCheckイベントの後にClickイベントが発生するので、大丈夫だと思います。
ただ、前に選択していた行とSelectedをTrueにした行の両方が青くなってしまう
みたいですが、List1.Refreshとすれば、SelectedをTrueにした行だけが青く
なります。
ツイート | ![]() |