【问题标题】:Drag and add items to ListView将项目拖放到 ListView
【发布时间】:2013-01-05 21:09:50
【问题描述】:

我有一个包含 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, ""));
    }
}

我希望添加一个项目来代替指向的项目,但是任何选项都会在组的末尾添加元素。 如何在鼠标悬停的位置添加项目?

【问题讨论】:

    标签: c# winforms listview treeview


    【解决方案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);
                    }
                }
    

    【讨论】:

    • 如果我想在后面添加:list.Insert(idx + 1, item);太棒了!
    • 太棒了...看起来它应该在给定您的原始代码的情况下工作,事实上,该项目进入 group.Items 列表中的正确插槽,但显然渲染使用其他东西来确定优先级。
    • 我将一个对象(类)绑定到一个项目。像测试 test = Test();然后 Item.Tag = test;
    猜你喜欢
    • 1970-01-01
    • 2016-03-26
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多