C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ListBoxの項目をドラッグ


(過去ログ 30 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■14499 / inTopicNo.1)  ListBoxの項目をドラッグ
  
□投稿者/ ヒジキ (1回)-(2008/02/20(Wed) 10:32:40)

分類:[.NET 全般] 

ListBox間で項目をドラッグ&ドロップで入れ替えることができるように拡張したクラスを作成しています。

単一項目の入れ替えは問題なくできましたが、ListBoxのMultiColumnをTrueにして、複数項目の入れ替えもできるようにしたいのですが、躓きました。

ListBoxのイベントではなく、メッセージをフックしてマウスのUpとDownを捕捉しています(ListBox間で共有できる処理にする必要があるので)。単一のときにうまくいったのは、マウスがDownした項目をDownした座標から取得しているからです(SelectedIndicesを参照していないです)。複数項目にした場合、すでに選択されている項目も当然取得しなければいけないのですが、ListBoxがクリックされて項目が選択される処理よりも、フックのほうが処理として早く発生してしまうため、フックして捕捉したクリックでの処理で、SelectedIndices等で選択された項目を取得しても、前回クリックされたときの項目しか取得できません。

何も考えなければ、SelectedIndices等で項目を取得せず、Alt及びShiftもフックして、クリック時に選択されている項目を何かしらで覚えておけば良いのでしょうが、思いのほか面倒ですし、スマートじゃない気がします。何か、よりスマートに実現する方法はありませんでしょうか?
引用返信 編集キー/
■14506 / inTopicNo.2)  Re[1]: ListBoxの項目をドラッグ
□投稿者/ 七曜 (77回)-(2008/02/20(Wed) 12:02:22)
No14499 (ヒジキ さん) に返信
> ListBox間で項目をドラッグ&ドロップで入れ替えることができるように拡張したクラスを作成しています。

[DoDragDrop メソッド]
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemwindowsformscontrolclassdodragdroptopic.asp

のサンプルコード(と同等の実装)で、SelectMode=OneでMultiColmun=trueまでは、問題なく動作するかと思います。
あとは、複数選択時のアイテム情報というか、ListBox間での情報のやり取り部分を改造すれば良いかと・・・。

メッセージフックを書かねばならない必然がある場合以外には、イベントハンドラを適切に記述するのが良いかと思います。


引用返信 編集キー/
■14508 / inTopicNo.3)  Re[2]: ListBoxの項目をドラッグ
□投稿者/ ヒジキ (2回)-(2008/02/20(Wed) 13:00:05)
No14506 (七曜 さん) に返信

参考リンクありがとうございます。
ムムム、相当読みづらい・・・ソースですね、マイクロソフトめ。というかListBoxにドラッグドロップ関連のイベントがある感じなのですね。頭悪いので結構読み解くのに時間がかかりそうな感じです。

> メッセージフックを書かねばならない必然がある場合以外には、イベントハンドラを適切に記述するのが良いかと思います。

フォーム外にマウスが出た場合の挙動も捕捉しないと厳密には間違っている感じがしたのでフックを使っています(フォーム外に出てマウスがUpしたときが主に問題です)。と考えたのですが、よくよく考えればイベントでいけた・・・かな。なんかいけそうな気がしてきましたわかんないですが。

とはいえ、全書き換えは面倒くさいなあ。どうにかならないかなあ。
引用返信 編集キー/
■14541 / inTopicNo.4)  Re[3]: ListBoxの項目をドラッグ
□投稿者/ ヒジキ (4回)-(2008/02/21(Thu) 12:14:05)
ごり押しでメッセージフックのまま処理できました!
なんかすみませんでした。ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -