0

3つのグループを持つListViewがあります。TreeViewからListViewにアイテムをドラッグします。

private void listViewDemo_DragDrop(object sender, DragEventArgs e)
{
    if (!is_listview) //treeview item
    {
        //get a text of a draged item
        string str = e.Data.GetData(DataFormats.Text).ToString();
        //get information about hovered item
        ListViewHitTestInfo hit_info =  listViewDemo.HitTest(listViewDemo.PointToClient(new Point(e.X, e.Y)));
        //check position - must be on an item
        if (hit_info.Location == ListViewHitTestLocations.None) return;
        ListViewItem prev_item = hit_info.Item;
        ListViewGroup group = prev_item.Group;
        int idx = prev_item.Index;
        //create a new key
        Guid key = Guid.NewGuid();
        string item_key = key.ToString();
        //create a new item
        //option 1
        group.Items.Add(listViewDemo.Items.Insert(idx,item_key, str, ""));
        //option2
        //group.Items.Insert(idx,listViewDemo.Items.Insert(idx, item_key, str, ""));
    }
}

先のとがったアイテムの代わりにアイテムを追加することを期待していますが、どのオプションでもグループの最後に要素を追加します。マウスを置いた場所にアイテムを追加するにはどうすればよいですか?

4

1 に答える 1

1

マウスポインタでアイテムの前にアイテムを配置したいとします...(これは少し野蛮な力ですが、機能します)。

また、元のコードがリスト全体でホットスポットアイテムのインデックスを見つけていたことにも注意してください。グループから取得するためにIndexOf呼び出しを追加しました。

            if (!is_listview) //treeview item 
            {
                //get a text of a dragged item 
                string str = e.Data.GetData(DataFormats.Text).ToString(); 
                //get information about hovered item 
                ListViewHitTestInfo hit_info = listView1.HitTest(listView1.PointToClient(new Point(e.X, e.Y))); 
                //check position - must be on an item 
                if (hit_info.Location == ListViewHitTestLocations.None) return; 
                ListViewItem prev_item = hit_info.Item; 
                ListViewGroup group = prev_item.Group;
                int idx = group.Items.IndexOf(prev_item);
                //create a new key 
                Guid key = Guid.NewGuid(); 
                string item_key = key.ToString(); 
                //create a new item 
                //option 1 
                List<ListViewItem> list = new List<ListViewItem>();
                while(group.Items.Count > 0)
                {
                    ListViewItem lvi = group.Items[0];
                    listView1.Items.Remove(lvi);
                    list.Add(lvi);
                }

                group.Items.Clear();
                ListViewItem item = new ListViewItem(str, "");
                item.Name = item_key;
                list.Insert(idx, item);
                foreach (ListViewItem i in list)
                {
                    listView1.Items.Add(i);
                    group.Items.Add(i);
                }
            }
于 2013-01-22T16:41:56.193 に答える