如何检查项目[name& subItem的文本]已存在于另一个listView中?

时间:2012-03-12 08:05:58

标签: c# listview contains listviewitem

我正在制作文件传输(服务器 - 客户端)应用程序..
我有两个listviewS来探索本地PC和远程PC ..在发送/接收项目之前..
我需要检查是否还有另一个文件或文件夹在目标路径上具有相同的名称.. 当我按下[发送或接收]按钮添加到列表中的项目..然后当我按下按钮[开始转移] ..它开始。

所以我按下按钮接收或发送时调用的AddItems方法..我从源ListView中获取 SelectedItems ..以及目标ListView的。 ..然后我检查 SelectedItems 中的每个项目是否存在于项目

enter image description here

我尝试使用

items.Contain(item)

但它没有用,即使该项目已经存在,也总是给我假 所以我使用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]检查名称和类型(文件或文件夹),因为每个项目已经有一个subItem,它告诉它是否是一个文件夹或文件

提前感谢。

2 个答案:

答案 0 :(得分:1)

一个简单的想法。

您可以利用您的Tag-Property包含的不仅仅是Transfer-Type。

由于它可以包含对象,因此您可以创建包含传输类型的自定义类以及有关该条目的更多信息。例如IsDirectory,您可以在以后使用它。

希望有所帮助 的Sascha

答案 1 :(得分:0)

请试试这个

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);
    }