- PR -

リストボックス内で任意の場所にドラッグアンドドロップする

投稿者投稿内容
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2005-02-28 19:54
リストボックス内でデータの並び替えを任意の場所にドラッグアンドドロップする感じで並び替えをしたいと思っております。
イメージとしては、IEのお気に入りの位置をづらすような感じです。
このようなリストボックスを標準のツールでできるものでしょうか?
同一のリスボックスからこの操作が行えることが条件です。
よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-01 01:21
ドラッグドロップの一連の操作を実装することになると思います。
同一リストボックスの例ではないですが、ここが参考になると思います。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclassdodragdroptopic.asp
IndexFromPointメソッド等を使って、どのリスト項目にドロップされたかを
取得することになるのかなぁと思います。
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2005-03-01 09:20
べるさん こんにちは
やはり別々のリストボックスになってしまいますよね。
でもCode Project当りを探せばあるかもしれないので探してみます。
コンポーネントが重たいのであまり好きではないのですが、GrapeCityのNetAdvantageを所有しているのでそれで出来ないか問い合わせてみる事にします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-01 20:11
私書き方が悪かったですね、応用すれば同一リストボックスでも出来ると思います。

リストボックスのAllowDropをtrueにしておおよそ以下のようにイベントハンドラを
実装する。不備は多々ありますがあくまでもサンプルです。
コード:
private void listBox1_MouseDown(object sender, MouseEventArgs e)

{
 DoDragDrop(listBox1.SelectedItem, DragDropEffects.Move);
}
private void listBox1_DragOver(object sender, DragEventArgs e)
{
 e.Effect = e.AllowedEffect;
}
private void listBox1_DragDrop(object sender, DragEventArgs e)
{
 if(listBox1.IndexFromPoint(listBox1.PointToClient(new Point(e.X, e.Y))) > -1)
 {
  listBox1.Items.Insert(listBox1.IndexFromPoint(listBox1.PointToClient(new
Point(e.X, e.Y))), e.Data.GetData(typeof(System.String)));
  listBox1.Items.RemoveAt(listBox1.SelectedIndex);
 }
}

#なんか、e.Data.GetDataしなくても擬似的に移動したほうがいい気もしてきました。

ListBoxを継承する方法もありました。
http://santamartadotnet.hp.infoseek.co.jp/documents/dotnettips/tips047.html

ListBoxにこだわらないということだったのですね。
GrapeCityのコントロールで出来るならそっちのほうが楽かもしれませんね。

[ メッセージ編集済み 編集者: べる 編集日時 2005-03-01 20:14 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-01 20:42
引用:

やはり別々のリストボックスになってしまいますよね。
でもCode Project当りを探せばあるかもしれないので探してみます。


 はぁ?例が別々なだけなのでは?アレンジして、自分でやってみましたか?どういう風にコーディングして、どうなったから「出来ない」と判断したのでしょう?探すのもいいですが、自分でやってみるのも大切では?

 2つのListBoxがあって、一方からもう一方へ送っているなら、“もう一方”を自分自身にすればいいだけですよね。DragSourceとDragTargetの実装の違いを見比べれば、DragTargetをドラッグソースにする方法、DragSourceをドラッグターゲットにするには何をすればいいか、わかりませんか?

# そっかぁ、ドラッグのスタートはこうするのか。
# イベントだけ見ててもわからないはずだ。
# べるさん、thanksです。

_________________
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-01 22:49
>だいまるさん
MSDNのサンプルとかをコピペして動かし(それなりの修正はあるにせよ)、何かしら動作している
状態からコードをいじっていくだけでも結構参考(場合によってはそのまま使う)になりますよ。

引用:
# そっかぁ、ドラッグのスタートはこうするのか。
# イベントだけ見ててもわからないはずだ。

私もDragLeaveイベントかなんかでドラッグがスタートするものだと思ってました。
ListViewだとドラッグ開始しただけでItemDragというイベントが発生するようですね。

[ メッセージ編集済み 編集者: べる 編集日時 2005-03-01 23:32 ]
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2005-03-02 11:05
べるさん。
大変丁寧にご指導頂いてサンプルまで考えて頂きありがとうございます。
これから実装してみて結果を報告させて頂きます。
まだASP.NETのプログラムしかやったことがなくこれから開発する条件にもなっていたので、私自身マウスのドラッグ操作の知識が全くない状態でとりあえず可能なことなのかを見極めたく実装する前に質問してしまいました事ごめんなさい。
おかげさまで出来ることがわかったので安心して開発に入れそうです。
これからもよろしくお願いします。

Jittaさん。
例が別々なだけで出来ないと判断してしまい申し訳ございません。
自分が同一リストボックス内でのドラッグという画面操作を今まで見たことがなくて固定概念で出来ないと思い込んでいたところがありMSDNのサンプルを見たときにはまだ理解ができなかったのです。。
でもべるさんがその後に書き込んでくれたサンプルで把握でき大変感謝しております。
回答が遅くて申し訳ございません。まだまだ未熟者ですが、これからもよろしくお願いします。
MSDNのサンプルをコピペするという手法も教えていただいてありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-03 22:08
引用:

ListViewだとドラッグ開始しただけでItemDragというイベントが発生するようですね。


 あ〜!「昔やったから、そんな難しくないはず」と思っていたのですが、こっちだ。。。

 TreeViewのドラッグドロップ移動も作った記憶があるのですが、BCB5なのと、「もう要らない」と思ったのか、見あたらない。。。

_________________

スキルアップ/キャリアアップ(JOB@IT)