2012-04-02 16 views
0

Ich habe ein bisschen Probleme mit dieser Methode.combolistbox.Item.Add (FileInfo) inkonsistent?

Wenn ich die Objekte des FileInfo-Typs in dragDropFiles durchlaufe und jeden einzelnen zum CLB hinzufüge, erhalte ich die Eigenschaft FullName (vollständiger Pfad zur Datei, die ich brauche), wenn das Element überprüft wird. Allerdings mit den hotFolderFiles anstelle des Pfades gibt es mir nur den Dateinamen.

Ich verstehe das nicht, weil sie den gleichen Objekttyp auf die gleiche Weise hinzufügen.

(ich habe auch versucht die Fileinfo für Hotfolder-Dateien bekommen die Directory statt meinem Wörterbuch mit gleichen Ergebnisse verwenden)

Warum ist das Verhalten im Widerspruch? (und wie kann ich es die fileinfo fullname statt Namen zurück?)

public frmFilesFound(string hotFolderPath, Dictionary<string, FileInfo> dragDropFiles, Dictionary<string, FileInfo> hotFolderFiles, bool ReadOnly) 
    { 
     try 
     { 
      InitializeComponent(); 
      readOnly = ReadOnly; 

      btnSelectAll.Visible = true; 
      clbSelectFilesFound.Visible = true; 
      clbSelectFilesFound.FormattingEnabled = true; 
      clbSelectFilesFound.Format += (s, e) => { e.Value = string.Format("{0}", ((FileInfo)e.ListItem).Name); }; 


      foreach (FileInfo fileInfo in dragDropFiles.Values) 
      { 
       if (!clbSelectFilesFound.Items.Contains(fileInfo)) 
       { 
        try 
        { 
         // If file not already present, add it to listbox 
         clbSelectFilesFound.Items.Add(fileInfo); 
        } 
        catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } 
       } 
      } 
      //intended to be hot folder path 
      if (!String.IsNullOrEmpty(hotFolderPath)) 
      { 
       DirectoryInfo dirInfo = new DirectoryInfo(hotFolderPath); 

       foreach (FileInfo fileInfo in dirInfo.GetFiles()) 
       //foreach (FileInfo fileInfo in hotFolderFiles.Values) 
       { 
        if (!clbSelectFilesFound.Items.Contains(fileInfo)) 
        { 
          try 
          { 
           clbSelectFilesFound.Items.Add(fileInfo); 
          } 
          catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } 
        } 
       } 
      } 
      lblDisplayedSelectMessage.Text = "More than one file is waiting. Please select the files you would like to use."; 
     } 
     catch (Exception ex) 
     { MessageBox.Show(ex.ToString()); } 

    } 

Antwort

0

Warum Sie nicht nur immer hinzufügen (fileInfo.FullName)?

+1

Das ist nur die Schönheit einer Combobox, Sie Objekte hinzufügen können. Ansonsten, z. die Eigenschaft SelectedItem hätte keine Verwendung. –

+0

Legen Sie dann seinen Datenelementfilter auf "FullName" fest, oder kennzeichnen Sie das Element mit der Dateiinfo selbst, damit Sie später darauf zugreifen können. – SimpleVar

+0

Ich füge das Objekt hinzu, weil ich den Dateinamen in der ComboListBox anzeigen möchte, aber ich möchte den FullName aus den Auswahlergebnissen verwenden. – negligible

1

Das liegt daran, dass die Methode DirectoryInfo.GetFiles nur den Namen der Datei und nicht den vollständigen Pfad eingibt.

diese Formatierer versuchen, wenn Sie nur den Namen der Datei in allen Fällen zeigen wollen:

clbSelectFilesFound.Format += (s, e) => { e.Value = Path.GetFileNameWithoutExtension(((FileInfo)e.ListItem).Name); };

+0

Ich bekomme das gleiche Ergebnis, wenn ich mein Wörterbuch verwende, siehe auskommentierte Zeile unten, anstelle von 'GetFiles()'. Allerdings funktioniert die Wörterbuchart korrekt innerhalb der ersten ForEach-Schleife. Meine Formatierung funktioniert wie vorgesehen. – negligible

+0

Ja, aber wir sehen nicht, woher die dragDropFiles und hotFolderFiles kommen. Also kann ich nur diese Work-Around vorschlagen –

+0

Ich verstehe nicht, warum Sie denken, dies wäre eine Arbeit um, das hat genau die gleiche Wirkung wie meine bestehenden Formatierer. (und meine Frage war nicht über die Formatierung) Und Sie können sehen, dass die DragDropFiles und HotFolderFiles stammen aus dem Konstruktor ... – negligible