Как скопировать selectedItems (просмотр списка) в переменную, а затем использовать его позже (копировать и вставить) FileExplorer в ListView - PullRequest
0 голосов
/ 03 февраля 2012

я создаю инструмент проводника в c # .. я использую ListView для исследования файлов

, но у меня возникает проблема при копировании элементов (файлов)

public ListView.SelectedListViewItemCollection copiedItems;

private void btnCopy_Click(object sender, EventArgs e)
    {
        copiedItems = listView1.SelectedItems;
        infoLabel.Text = "Item(s) copied to clipboard.";
    }

private void Paste()
    {
        if (copiedItems != null)
        {
            foreach (ListViewItem item in copiedItems)
            {
                if (File.Exists(item.ToolTipText))
                {
                    if (MessageBox.Show(item.ToolTipText + "is already exists\r\nDo you want to overwrite it?"
                    , "Overwrite", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)
                    {
                        File.Copy(item.ToolTipText, currAddress, true);
                        infoLabel.Text = "Item(s) Pasted.";
                    }
                    return;
                }
                File.Copy(item.ToolTipText, currAddress, false);
                infoLabel.Text = "Item(s) Pasted.";
            }
        }
    }

при изменениипапка, в которую я нахожусь (currAddress) .. вставка не работает, потому что

 ListView.SelectedListViewItemCollection copiedItems 

изменилось на ноль... вот мой код проводника

private void DirRecursive(string path)
    {
            DirectoryInfo dir = new DirectoryInfo(path);
            currAddress = path;
            txtAddress.Text = path;
            _iconListManager.ClearLists();
            listView1.Items.Clear();
            foreach (DirectoryInfo folder in dir.GetDirectories())
                {
                    if ((folder.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                        continue;
                    ListViewItem item = new ListViewItem();
                    item.Text = folder.Name;
                    item.Tag = (object)folder.Parent;
                    item.ToolTipText = folder.FullName;
                    item.ImageIndex = _iconListManager.AddFolderIcon(folder.FullName);
                    listView1.Items.Add(item);
                }
                foreach (FileInfo file in dir.GetFiles())
                {
                    if ((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                        continue;
                    ListViewItem item = new ListViewItem();
                    item.Text = file.Name;
                    item.Tag = (object)file.Directory.Parent;
                    item.ToolTipText = file.FullName;
                    item.ImageIndex = _iconListManager.AddFileIcon(file.FullName);
                    item.SubItems.Add(CnvrtUnit(file.Length));
                    listView1.Items.Add(item);
                }

Есть ли какое-либо объяснение, почему copiedItems изменилось на null и как я могу это исправить?

заранее спасибо:)

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

вместо

public ListView.SelectedListViewItemCollection copiedItems;

использование

public List<string> copiedItems;

Изменить btnCopy_Click на это:

private void btnCopy_Click(object sender, EventArgs e)
    {
        copiedItems = listView1..SelectedItems.Cast<ListViewItem>().Select(li => li.ToolTipText).ToList();
        infoLabel.Text = "Item(s) copied to clipboard.";
    }

изменить Paste на это:

private void Paste()
    {
        if (copiedItems != null)
        {
            foreach (string item in copiedItems)
            {
                if (File.Exists(item))
                {
                    if (MessageBox.Show(item + "is already exists\r\nDo you want to overwrite it?"
                    , "Overwrite", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)
                    {
                        File.Copy(item, currAddress, true);
                        infoLabel.Text = "Item(s) Pasted.";
                    }
                    return;
                }
                File.Copy(item, currAddress, false);
                infoLabel.Text = "Item(s) Pasted.";
            }
        }
    }
1 голос
/ 03 февраля 2012

Я считаю, что "listview1.SelectedItems" просто дает вам ссылку на выбранные элементы. Это означает, что «copiedItems» указывает на тот же объект, что и «listview1.SelectedItems». Вот почему, когда вы очищаете элементы listview1 в DirRecursive, вы очищаете скопированные элементы. Вам необходимо получить отдельную копию предметов. Для этого вам, вероятно, следует использовать что-то вроде этого:

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

foreach (ListViewItem item in listView1.Items)
{
    copiedItems.Add((ListViewItem) item.Clone());
}
0 голосов
/ 03 февраля 2012

Переменная copiedItems фактически не хранит элементы, а скорее хранит ссылку на то, где находятся выбранные элементы.Или что-то в этом роде.Если во время вставки будут выбраны одни и те же элементы, все будет в порядке.Но после отмены выбора элементов в представлении списка ваша переменная copiedItems станет пустым списком.Вам необходимо явно скопировать элементы, выбранные при нажатии кнопки копирования.Следующий пример программы иллюстрирует то, о чем я говорю.Для этого запустите новый проект WinForms, перетащите элемент ListView и два элемента управления Button на форму и замените код в Form1.cs следующим.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        ListView.SelectedListViewItemCollection items1;
        List<int> items2;

        public Form1()
        {
            InitializeComponent();
            items2 = new List<int>();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                listView1.Items.Add(i.ToString());
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            items1 = listView1.SelectedItems;
            foreach (var item in listView1.SelectedItems)
            {
                ListViewItem lvItem =(ListViewItem)item; 
                items2.Add(int.Parse(lvItem.Text));
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {

        }
    }
}
...