Перетащите элемент ListView из одного списка в другой.

Прямо сейчас я могу перетащить элемент из listView 1 в listView 2. Как вы клонируете/копируете/перемещаете данные элемента? Gif о том, что я имею в виду

виджетлист — это listView1. ака список в крайнем правом углу.

private void fillWidgetList()
    {
        widgetList.Groups.Add(new ListViewGroup("System", HorizontalAlignment.Left));

        var cpu = new ListViewItem { Text = "CPU", Tag = "", Group = widgetList.Groups["System"] };
        var ram = new ListViewItem { Text = "RAM", Tag = "", Group = widgetList.Groups["System"] };
        widgetList.Items.Add(cpu);
        widgetList.Items.Add(ram);
    }

widgetCollectionList — это listView2. ака список в середине.

private void widgetList_ItemDrag(object sender, ItemDragEventArgs e)
    {
        DoDragDrop(e.Item, DragDropEffects.Move);
        // am i suppose to save the dragged item somewhere?
    }

    private void widgetCollectionList_DragEnter(object sender, DragEventArgs e)
    {
        //e.Effect = DragDropEffects.Copy;

        if (e.Data.GetDataPresent(typeof(ListViewItem)))
        {
            e.Effect = DragDropEffects.Move;
        }
    }

    private void widgetCollectionList_DragDrop(object sender, DragEventArgs e)
    {
        widgetCollectionList.Items.Add(e.Data.ToString()); // What do i replace this with?
    }

    private void WidgetMaker_Load(object sender, System.EventArgs e)
    {
        widgetCollectionList.AllowDrop = true;
        widgetCollectionList.DragDrop += new DragEventHandler(widgetCollectionList_DragDrop);
    }

person SoyDuck    schedule 02.07.2016    source источник
comment
LVI может принадлежать только одному LV. Чтобы двигаться, вы просто добавляете его. Чтобы скопировать, вам нужно клонировать его. Поскольку вы помещаете LVI в буфер обмена, вы должны привести его обратно в событии DragDrop. Рассмотрите возможность использования набора LVI, чтобы вы могли использовать более одного за раз.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 02.07.2016
comment
будет клонировать перетаскиваемый элемент в List‹ListViewItem› copyItems = new List‹ListViewItem›(); затем клонировать элемент в событии перетаскивания? если да, то как мне получить элемент из события ItemDrag в список? его бросок не может преобразовать объект в listviewitem   -  person SoyDuck    schedule 02.07.2016
comment
Что вы хотите сделать: а) переместить, б) скопировать в) любой в зависимости от пользователя? e.Item будет содержать все, что вы поместите туда в DoDragDrop   -  person Ňɏssa Pøngjǣrdenlarp    schedule 02.07.2016
comment
Переезд был бы идеальным   -  person SoyDuck    schedule 02.07.2016


Ответы (1)


Вы почти там. Вы не передаете объекты, переданные в e.Data, обратно в LVI, а объект LVI может принадлежать только одному ListView. Итак, чтобы их переместить, вам нужно сначала удалить их из старого; чтобы скопировать их, вам нужно их клонировать. (Groups сделайте это намного интереснее: можно ли бросить овощной предмет в группу фруктов?)

Я расширил его, чтобы он мог перемещать все выбранные элементы, чтобы одновременно можно было перемещать более одного. Его легко удалить, если это не то, что вы хотите.

private void lv_ItemDrag(object sender, ItemDragEventArgs e)
{
    // create array or collection for all selected items
    var items = new List<ListViewItem>();
    // add dragged one first
    items.Add((ListViewItem)e.Item);
    // optionally add the other selected ones
    foreach (ListViewItem lvi in lv.SelectedItems)
    {
        if (!items.Contains(lvi))
        {
            items.Add(lvi);
        }
    }
    // pass the items to move...
    lv.DoDragDrop(items, DragDropEffects.Move);
}

// this SHOULD look at KeyState to disallow actions not supported
private void lv2_DragOver(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(List<ListViewItem>)))
    {
        e.Effect = DragDropEffects.Move;
    }
}

private void lv2_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(List<ListViewItem>)))
    {
        var items = (List<ListViewItem>)e.Data.GetData(typeof(List<ListViewItem>));
        // move to dest LV
        foreach (ListViewItem lvi in items)
        {
            // LVI obj can only belong to one LVI, remove
            lvi.ListView.Items.Remove(lvi);
            lv2.Items.Add(lvi);
        }
    }
}
person Ňɏssa Pøngjǣrdenlarp    schedule 02.07.2016
comment
Блестяще, именно то, что я искал. Еще одно знание добавилось в мою копилку знаний. Спасибо :) - person SoyDuck; 02.07.2016