2012-03-12 29 views
0

我正在做一個文件傳輸(服務器 - 客戶端)應用程序..
我有兩個listviewS探索本地PC和遠程PC ..之前發送/接收項目..
我需要檢查是否有另一個文件或文件夾有同名的目的地路徑.. 當我按下按鈕[發送或接收]項目添加到列表..然後當我按下按鈕[開始傳輸] ..它開始。
如何檢查項目[name&subItem的文本]是否已經存在於另一個listView中?

所以爲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 
    }; 

那麼,如何解決這個問題的項目..我應該使用一個自定義的方法,而不是[包含],對於名稱和檢查類型(文件或文件夾),因爲每個項目已經有一個子項,告訴它是否是一個文件夾或文件

在此先感謝。

+0

您需要添加另一個函數來獲取類型(文件或文件夾),然後使用在相同的if語句。 – PraveenVenu 2012-03-12 08:10:32

+0

@PraVn每個項目都有子項目[1] ..如果它是一個文件,它將是大小[15 M.B] ..如果它是一個文件夾,它將[文件夾] ..我的意思是我已經有項目類型。 – 2012-03-12 08:26:57

+0

@TimSchmelter項目的類型是ListViewItem :) – 2012-03-12 08:27:12

回答

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

那麼它沒有正常工作..但這個想法是完美的..非常感謝。我解決了它 – 2012-03-14 04:26:47

1

一個快速的想法。

你可以利用你的標籤屬性來包含不僅僅是轉移類型。

因爲它可以包含對象,所以您可以創建一個包含您的傳輸類型的自定義類以及有關該條目的更多信息。例如IsDirectory,你可以在以後使用它。

希望幫助 薩沙

+0

是啊實際上..我已經在所有項目的大小像[[15 MB]]如果它的一個文件和[「文件夾」]如果它是一個設置subItem [1]文件夾..所以我可以檢查item.subItem [1] ==「文件夾」..但即時嘗試避免創建自定義的方法,而不是包含。 – 2012-03-12 08:22:56

+0

我恐怕你可能不得不考慮你的方法。如果您設法將臨時文件並排複製到臨時文件夾,那麼您的字典中可能會有兩個鍵「temp」,這是無效的。無論如何 - 你有沒有考慮過使用Linq?看到這裏的靈感http://stackoverflow.com/questions/4505602/easiest-way-to-implement-contains-on-a-icollectiontuplet1-t2 – 2012-03-12 08:35:53

+0

所以你的意思是Item.Name應該是唯一的..感謝您注意到我關於這個..我將對代碼進行修改。 – 2012-03-12 08:45:32

相關問題