2012-03-12 8 views
0

私はファイル転送(サーバークライアント)アプリケーションを作成しています。
ローカルPCとリモートPCを探索する2つのリストビューがあります。アイテムを送受信する前に..
別のファイルやフォルダがあるかどうかを確認する必要があります宛先パスに同じ名前があります。 [送信または受信]ボタンを押すと、リストに追加された項目が表示されます。[開始転送]ボタンを押すと開始します。私はボタンが受信または送信を押すと
アイテム[name&subItemのテキスト]がすでに別のlistViewに存在するかどうかを確認する方法は?

のでAddItems方法は、私は、各項目をチェックし...私はソースリストビューから selectedItemsの ...とアイテム先リストビューのを取得します。..と呼ばれます selectedItemsので、それは私が

を使用しようとした アイテム

enter image description here

に存在している場合

しかし、それがうまくいかなかったのは、そのアイテムが既に存在していても私には常に間違いを与えました。
私は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は、確認ダイアログボックスの[Yes to all]ボタンをクリックしたときにtrueに設定されます。
なtransferTypeは、SendMethodまたはReceiveMethod

public enum TransferType 
    { 
     Send , Receive 
    }; 

を使用するように起こっている場合、私は使用する必要があります。..ので、私はそれをどのように修正すればよいだけのアイテムをマークするために、独自の方法ではなく、[含まれて]の名前のためにとをチェックしています各項目にはすでにフォルダまたはファイルであるかどうかを示すサブアイテムがあるので、タイプ(ファイルまたはフォルダ)は

ありがとうございます。

+0

を試してみてください。 – PraveenVenu

+0

@PraVn各アイテムにはサブアイテム[1]があります。ファイルの場合はサイズ[15 M.B]になります。フォルダの場合は[フォルダ]になります。既にアイテムタイプがあることを意味します。 –

+0

@TimSchmelterアイテムのタイプはListViewItemです。 –

答えて

0

を助け

希望はあなたがタイプ(ファイルまたはフォルダ)を取得し、if文と同じでそれを使用するために別の関数を追加する必要があり、この

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

それは正確には動作しませんでしたが、アイデアは完璧です..ありがとう。私はそれを解決しました –

1

簡単なアイデア。

タグタイプを使用して、転送タイプ以外のものを含めることができます。

オブジェクトを含むことができるので、転送タイプとそのエントリに関する詳細情報を含むカスタムクラスを作成できます。たとえば、IsDirectoryを使用して、それを後で利用することができます。 サシャ

+0

実際には..私はすでにサブアイテム[1]をファイルの場合は["15 MB"]のようにすべてのアイテムに設定していますフォルダ.. .. item.subItem [1] == "Folder" ..を確認することができますが、Containsの代わりにカスタムメソッドを作成しないようにしようとしています。 –

+0

とにかくあなたのことを考えなければならないのではないかと心配しています。一時ファイルを一時フォルダに並べてコピーすると、辞書のキー「temp」で2つのエントリが存在する可能性があります。とにかく - Linqを使うことを考えましたか?インスピレーションはこちらhttp://stackoverflow.com/questions/4505602/easiest-way-to-implement-contains-on-aicollectiontuplet1-t2 –

+0

Item.Nameはユニークである必要があります。私はコードについてのリビジョンを持っています。 –

関連する問題