DOBON.NET DOBON.NETプログラミング掲示板過去ログ

listviewで選択終了の判定は?

環境/言語:[Xp VB.net1.1]
分類:[.NET]

ListViewでCtrl+AやShift押しながらクリックした場合に、選択し終わったことを知るにはどうすればいいでしょう?
例えば20個アイテムがあって、10個選択していてCtrl+Aした場合SelectedIndexChangedでSelectedItems.Countを取ってみると10,9,8,…0,1,2,3,…19,20となります
(つまり30回くらいSelectedIndexChangedが発生します)
この途中は無視して最後の20でだけ以降の処理をしたいのですが、どうやって最後であることを判別すればいいのでしょう?
Ctrl+Aなら全アイテム数と比べればいいのでしょうが、Shift+クリックの場合は不可能だし…
こんにちは。ガッ!

結論から言うと「無理です」と思います。

せっかくなので、もう少し考えてみるとしましょう。
「選択し終わった」とユーザが決定するのは、いつのタイミングになるでしょうか。
SHIFT+クリックで1個、2個と選択して、よーしこれで俺が必要なアイテムは全部選択
したぜ!というユーザの「気持ち」を、プログラムはどこで察知すれば良いのかというこ
とですよね。

俺が必要なアイテムは全部選択した…あ待って、やっぱこれとこれ選択し忘れた、な
んてことになるかもしれませんし、そこはプログラムでは判断できないんじゃないかな
ー?と思うわけです。少なくとも私は。
お店で買い物をするときに置き換えてみるといいかもしれませんが、よし今日の夕食
に必要な食材は全部買ったわ!と奥さんが思ったとして(舞台背景については深く詮
索しないように)、それを最終的にお店に伝えるのはレジに行った時点だと思うのです。
逆に言えば、レジに行くまでは一度かごに入れた牛乳の日付が古いから別のに変更
するとか、豚肉を買い忘れたから追加ねとか、そういったことも自由なわけで。

何が言いたいのかというと、ユーザが全部選択したということを、ボタンか何かを押し
てもらうことによって報告してもらわなくてはいけないのでは?という話ですね。
なので、選択終了を知らせるアクションをユーザに起こしてもらうべきだと思います。
#判定は?の回答ではありません。

CTRL+AやShift+ClickなどはWindowsの機能で、その通知を受けてまとめて「単一選択」をおこなっているだけだと思います。
つまり「選択されるべき対象の集合」の概念は無いでしょう。

例えばCTRLを押しながらひとつひとつ選択する行為を永続的に続けるとどうなるでしょうか?

まずは「終わり」という概念を捨てて設計してみてはどうでしょうか。

頻繁に発生するイベントとその実装の重さが問題なら
「選択数をステータスバーに表示」くらいだったらリアルタイムに変更してもよいと思います。
> 何が言いたいのかというと、ユーザが全部選択したということを、ボタンか何かを押し
> てもらうことによって報告してもらわなくてはいけないのでは?という話ですね。
> なので、選択終了を知らせるアクションをユーザに起こしてもらうべきだと思います。
 ↑こっちをお勧めしますが、

タイマーを使って一定時間以内に発生した SelectedIndexChanged
イベントは後に発生したイベントで処理するとか?
ぽぴ王子さん、まどかさん、るしぇさん レス有り難うございます

最初にまぎらわしかったようなので訂正しておきます
「選択し終わった」と言うのはユーザーがと言うことではなく、Ctrl+A等で延々と発生する一連のSelectedIndexChangedの「これが最後のイベント」だというのを知る方法は?ということです

実際の所Ctrl+ポチポチは1つづつしか増えないので逐次処理してもかまわんのです
Ctrl+Aで例えばファイルが1000とかあると延々と処理されるのが辛いなあと

実際ここでしている処理は選択ブロックのトップが変わったか調べて、変わったらファイル情報を取得して表示して(ブロックの先頭だけ表示しているから)、次の処理に備えて選択されたファイルのリスト作って…
というようなものですので、毎回する必要は無いんですよね
(てかしても意味無い)

で、タイマーは私も考えてはみたのですが、ちょっと泥縄だなあと…
何かスマートにやる方法は無いかなと思ったのですが…

とりあえずタイマーで考えてみます
(MouseDownやKeyDownでフラグ立ててSelectedIndexChangedで積算時間リセットしてTimerTickで一定時間以上経ってたら実行?)
でもタイマーで実行制御するのって、負荷が大きい時とか暴発しそうで怖いな…
解決済み!
> 次の処理に備えて選択されたファイルのリスト作って…

これはOKボタンなどでリストを作っていないということですか?
うーん、最終的にできればいいような。。。

> とりあえずタイマーで考えてみます
業務仕様に対するコストがめちゃくちゃ高いような気が。
CTRL+Aの途中でイベントハンドラが呼ばれたらどうなるんでしょ?

考えてみましたが、ファイルIOをどこでするかも大きな判断条件ではないでしょうか?
リストの候補は変動するんでしょうか?
変動しないなら各ファイル情報は一度取得すれば再利用すればよいですよね。
かつ、最初に全部作っておいて選択/非選択のみを変動させられます。
そうなら頻繁にイベントが発生しても負荷はかからないはずです。

DOBON.NET | プログラミング道 | プログラミング掲示板