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

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

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

Re[3]: 詳細表示のListViewでD&Dでの並べ替えをしたい


(過去ログ 11 を表示中)

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

■3056 / inTopicNo.1)  詳細表示のListViewでD&Dでの並べ替えをしたい
  
□投稿者/ Hirotow (84回)-(2007/04/22(Sun) 10:36:30)
Hirotow さんの Web サイト

分類:[C# (Windows)] 

2007/04/22(Sun) 11:54:18 編集(投稿者)

現在個人的に作成しているアプリケーションについてですが、
詳細表示のListViewのドラッグドロップについて、外側にドロップしたときはファイルドロップ(コピー)、自分自身にドロップしたときにはIrvineのダウンロードリストのようにその位置へ移動(並べ替え)するような処理を行いたいのですが、まったく道筋がつかめません。
どなたかご教授をお願いします。
引用返信 編集キー/
■3059 / inTopicNo.2)  Re[1]: 詳細表示のListViewでD&Dでの並べ替えをしたい
□投稿者/ Hongliang (129回)-(2007/04/22(Sun) 12:22:52)
Hongliang さんの Web サイト
答える側としてもなかなか何を答えればいいか難しい(w;

ドラッグの開始は ItemDrag イベントが使えます。
ドラッグ処理自体は DoDragDrop メソッドを呼び出すだけ。
問題は何を DoDragDrop に渡すかですが、他のアプリケーションに渡せるようにするには IDataObject(普通はその実装クラスである DataObject)になるでしょう。
なお、D&D 操作で渡されたデータを元にどうするかはドロップ先のアプリケーションが判断することであり、ドラッグ元は DragDropEffects によってどうするべきか示唆することしかできない点には注意が必要です。
引用返信 編集キー/
■3060 / inTopicNo.3)  Re[2]: 詳細表示のListViewでD&Dでの並べ替えをしたい
□投稿者/ Hirotow (85回)-(2007/04/22(Sun) 12:37:32)
Hirotow さんの Web サイト
現時点ではItemDragでListViewItemに関連付けられたファイル名の配列をFileDropする仕様になっているのですが、これに加えて選択されたインデックスの配列を投げ、内部にドロップされたときに受け取り並べ替えを行う機能を追加しようと思っています。
引用返信 編集キー/
■3061 / inTopicNo.4)  Re[3]: 詳細表示のListViewでD&Dでの並べ替えをしたい
□投稿者/ Hirotow (86回)-(2007/04/22(Sun) 13:21:53)
Hirotow さんの Web サイト
自己解決しました。

ソースコードを以下に示します。

        /// <summary>
        /// 選択されたダウンロードのドラッグを開始します。
        /// </summary>
        private void CDownloadListView_ItemDrag(object sender, ItemDragEventArgs e)
        {
            if (CDownloadListView.SelectedItems.Count > 0)
            {
                List<string> filelist = new List<string>();

                foreach (ListViewItem item in CDownloadListView.SelectedItems)
                {
                    try
                    {
                        string file = ((e.Item as ListViewItem).Tag as Downloader).Location;
                        if (File.Exists(file))
                            filelist.Add(file);
                    }
                    catch { }
                }

                if (filelist.Count > 0)
                {
                    DataObject fdata = new DataObject(DataFormats.FileDrop, filelist.ToArray());
                    DoDragDrop(fdata, DragDropEffects.Copy);
                }

                DataObject idata = new DataObject(CDownloadListView.SelectedIndices);
                DoDragDrop(idata, DragDropEffects.Move);
            }
        }

        private void CDownloadListView_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(ListView.SelectedIndexCollection)))
                e.Effect = DragDropEffects.Move;
        }

        /// <summary>
        /// ドロップされたダウンロードを並べ替えます。
        /// </summary>
        private void CDownloadListView_DragDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(ListView.SelectedIndexCollection)))
            {
                Point p = CDownloadListView.PointToClient(Cursor.Position);
                ListViewItem baseitem =
                    CDownloadListView.GetItemAt(p.X, p.Y);

                if (baseitem != null)
                {
                    ListView.SelectedIndexCollection indices =
                        (ListView.SelectedIndexCollection)e.Data.GetData(typeof(ListView.SelectedIndexCollection));

                    List<ListViewItem> items = new List<ListViewItem>();

                    CDownloadListView.SuspendLayout();

                    foreach (int index in indices)
                    {
                        ListViewItem item = CDownloadListView.Items[index];
                        if (item == baseitem)
                            return;
                        items.Add(item);
                    }

                    foreach(ListViewItem item in items)
                        CDownloadListView.Items.Remove(item);

                    items.Reverse();

                    int baseindex = baseitem.Index;

                    foreach (ListViewItem item in items)
                        CDownloadListView.Items.Insert(baseindex, item);

                    CDownloadListView.ResumeLayout();
                }
            }
        }

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -