Как проверить, существует ли элемент [текст name & subItem] в другом listView? - PullRequest
0 голосов
/ 12 марта 2012

я делаю приложение для передачи файлов (сервер-клиент) ..
у меня есть два listviewS для исследования Локального ПК и Удаленного ПК .. перед отправкой / получением элементов ..
мне нужно проверить, есть ли другойфайл или папка имеют одно и то же имя в пути назначения ... когда я нажимаю на кнопку [отправить или получить] элемент, добавленный в список ... затем, когда я нажимаю на кнопку [Начать передачу] .., он запускается.

, поэтому метод AddItems вызывается, когда я нажимаю кнопку Получить или отправить .. Я получаю SelectedItems из исходного ListView .. и Элементы целевого ListView... затем я проверяю каждый элемент в SelectedItems , если он существует в Items

enter image description here

, который я пытался использовать

items.Contain(item)

но это не сработало, но всегда выдавало мне false, даже если элемент уже существует.
, поэтому я использовал items.ContainKey, и это сработало ... но в случае, если у меня есть файл с именем "Temp "без расширения и папка в пути назначения также называется" Temp ".. он вернет True .. и это моя проблема ..

bool YesToAll = false;
public void AddItems(ListView.SelectedListViewItemCollection selectedItems, ListView.ListViewItemCollection items,TransferType type,string destPath)
{
        foreach(ListViewItem item in selectedItems)
        {
            if (items.ContainsKey(item.Name) && !YesToAll)
            {
                MyMessageBox msgbox = new MyMessageBox("Item is already exists .. Do you want to replace (" + item.Text + ") ?");
                msgbox.ShowDialog();
                if (msgbox.DialogResult == DialogResult.Yes)
                {
                    Add(item, type, destPath);
                }
                else if (msgbox.DialogResult == DialogResult.OK)
                {
                    YesToAll = true;
                    Add(item, type, destPath);
                }
                else if (msgbox.DialogResult == DialogResult.No)
                {
                    continue;
                }
                else
                {
                    return;
                }
            }
            else
            {
                Add(item, type, destPath);
            }
        }
        YesToAll = false;
    }
    private void Add(ListViewItem item,TransferType type,string path)
    {
        ListViewItem newItem = (ListViewItem)item.Clone();
        newItem.ImageIndex = imageList1.Images.Add(item.ImageList.Images[item.ImageIndex],Color.Transparent);
        newItem.SubItems.Add(type.ToString());
        newItem.SubItems.Add(path);
        newItem.Tag = type;
        listView1.Items.Add(newItem);
    } 

YesToAll устанавливается в значение true, когда пользователь нажимает кнопку [Да для всех] в диалоговом окне подтверждения.
TransferTypeпросто пометить элемент, если он собирается использовать SendMethod или ReceiveMethod

public enum TransferType
    {
        Send , Receive
    };

, так как я могу это исправить ... если я использую пользовательский метод вместо [Contains], который проверяет имя и длявведите (файл или папка), поскольку каждый элемент уже имеет подэлемент, который заранее сообщает, является ли он папкой или файлом

.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Одна быстрая идея.

Вы можете использовать свой Tag-Property, чтобы он содержал больше, чем просто Transfer-Type.

Поскольку он может содержать объекты, вы можете создать собственный класс, содержащий ваш тип передачи, а также дополнительную информацию о записи. Например, IsDirectory, и вы можете использовать это позже.

Надеюсь, это поможет Sascha

0 голосов
/ 12 марта 2012

Пожалуйста, попробуйте это

bool YesToAll = false;
public void AddItems(ListView.SelectedListViewItemCollection selectedItems, ListView.ListViewItemCollection items,TransferType type,string destPath)
{
        foreach(ListViewItem item in selectedItems)
        {
            if (items.ContainsKey(item.Name) && !YesToAll)
            {   
                ListViewItem lvtemp=items.Find(item.Name)[0];
if((lvTemp.SubItems[0].Text!= "[Folder]" && item.SubItem[0].Text!="[Folder]" ) or (lvTemp.SubItems[0].Text== item.SubItems[0].Text && lvTemp.SubItems[0].Text="[Folder]") )
{
                MyMessageBox msgbox = new MyMessageBox("Item is already exists .. Do you want to replace (" + item.Text + ") ?");
                msgbox.ShowDialog();
                if (msgbox.DialogResult == DialogResult.Yes)
                {
                    Add(item, type, destPath);
                }
                else if (msgbox.DialogResult == DialogResult.OK)
                {
                    YesToAll = true;
                    Add(item, type, destPath);
                }
                else if (msgbox.DialogResult == DialogResult.No)
                {
                    continue;
                }
                else
                {
                    return;
                }
}
            }
            else
            {
                Add(item, type, destPath);
            }
        }
        YesToAll = false;
    }
    private void Add(ListViewItem item,TransferType type,string path)
    {
        ListViewItem newItem = (ListViewItem)item.Clone();
        newItem.ImageIndex = imageList1.Images.Add(item.ImageList.Images[item.ImageIndex],Color.Transparent);
        newItem.SubItems.Add(type.ToString());
        newItem.SubItems.Add(path);
        newItem.Tag = type;
        listView1.Items.Add(newItem);
    }
...