2016-06-17 3 views
0

Ich habe ein Programm (C#,. NET 4.5, WPF), die Dateien aus mehreren verschiedenen Pfaden verwendet. Um es dem Benutzer zu ermöglichen, zu dem Ort für diesen Dateityp zu navigieren, instanziierte ich für jeden einen anderen OpenFileDialog in der Hoffnung, dass jeder getrennt nach seinem zuletzt verwendeten Verzeichnis suchen würde.Openfiledialogs stören und Verzeichnisse persistent

//Class variables 
OpenFileDialog wordFileDlg = new OpenFileDialog(); 
OpenFileDialog excelFileDlg = new OpenFileDialog(); 
Dictionary<FILETYPES, OpenFileDialog> fdialogs = new Dictionary<FILETYPES, OpenFileDialog>(); 

//from Main 
wordFileDlg.FilterIndex = 2; 
wordFileDlg.RestoreDirectory = true; 
wordFileDlg.Title = "Choose Word Document Template"; 
wordFileDlg.Filter = "All files (*.docx)|*.docx"; 

excelFileDlg.FilterIndex = 2; 
excelFileDlg.RestoreDirectory = true; 
excelFileDlg.Title = "Choose Excel or XML Data File"; 
excelFileDlg.Filter = "All files (*.xls*;*.xml)|*.xls*;*.xml"; 

wordFileDlg.InitialDirectory = @"d:\downloads-tmp\"; 
excelFileDlg.InitialDirectory = @"D:\Document\Spreadsheets"; 

fdialogs[FILETYPES.WORD] = wordFileDlg; 
fdialogs[FILETYPES.EXCEL] = excelFileDlg; 
//... End Main 


private string browseForFile(FILETYPES filetype, out string result) 
{ 
    Trace.WriteLine("Using OpenFileDialog with initial dir = " + fdialogs[filetype].InitialDirectory); 
    DialogResult dr; 

    dr = fdialogs[filetype].ShowDialog(); 
    result = dr.ToString(); 
    Trace.WriteLine("Dialog result dr= " + dr.ToString()+", type of dr = "); 
    if (!dr.ToString().Equals("Cancel")) 
    { 
     clearWarning(); 
    } 
    return fdialogs[filetype].FileName; 
} 

Dies scheint intermittierend zu arbeiten. Manchmal, wenn ich eine Datei aus einem Dateidialog (wordFileDlg) auswähle, wird beim nächsten Öffnen des anderen Dateidialogs (excelFileDlg) das Verzeichnis in das zuletzt ausgewählte Verzeichnis von wordFileDlg geändert. Andersherum ist nicht wahr. Warum sollte es das tun?

Ich setze die anfängliche Verzeichniseigenschaft auf einen Standardwert, aber selbst das letzte Verzeichnis scheint über Sitzungen hinweg zu bestehen. Ich setze die Eigenschaft restoreDirectory auf false Ich öffne das Programm, suche nach einigen Dateien und schließe das Programm. Ich öffne das Programm erneut und das Durchsuchen führt mich nicht zum ursprünglichen Verzeichnis, sondern zurück zum zuletzt ausgewählten Verzeichnis. Wie weiß es das überhaupt? Ich finde keinen Weg, den Dateidialog zu einem bestimmten Verzeichnis zu öffnen. Ich habe versucht, RestoreDirectory auf true und false zu setzen.

Wie kann ich verschiedene Dateidialoge haben, erinnere mich an ihre eigenen Verzeichnisse und NICHT über Sitzungen bestehen, und kann ich das Verzeichnis, das es öffnet, festlegen?

+0

Sie können nicht. Sie kämpfen mit dem Betriebssystem, das davon ausgehen möchte, dass der Benutzer die nächste Datei vom selben Ort aus öffnen möchte. Sie werden dieses Argument nicht gewinnen. –

+0

Die beiden Dialoge öffnen sich in verschiedenen Ordnern, also läuft hier noch etwas anderes. Hat jemand eine Open-Source-Dateibrowser-Klasse erstellt, die ich unterklassifizieren kann oder die diese Funktionalität hat? – Matt

Antwort

0

Ich weiß, es ist eine alte Frage, aber ich stolperte selbst über ein ähnliches (wenn auch einfacheres) Problem.

Ich fürchte, Sie können nicht wirklich bekommen, was Sie wollen - aber es ist einfach genug, um eine Zeichenfolge Variable, die Sie verwenden, um das Verzeichnis zu speichern, die Sie gehen sollten. Du könntest es in eine Klasse einbetten, und voila !, du hast, was du brauchst.

Hier ist meine Klasse:

public class PersistentOpenFileDialog 
{ 
    OpenFileDialog m_ofd = new OpenFileDialog(); 
    string m_persistentDirectory = null; 

    public PersistentOpenFileDialog() 
    { 
     m_ofd.CheckFileExists = true; 
     m_ofd.CheckPathExists = true; 
     m_ofd.ReadOnlyChecked = true; 
    } 

    public bool? ShowDialog() 
    { 
     if (m_persistentDirectory != null) 
     { 
      m_ofd.InitialDirectory = m_persistentDirectory; 
     } 
     bool? retval = m_ofd.ShowDialog(); 
     if (retval == true) 
     { 
      m_persistentDirectory = new FileInfo(FileName).DirectoryName; 
     } 

     return retval; 
    } 

    public string FileName 
    { 
     get { return m_ofd.FileName; } 
     set { m_ofd.FileName = value; } 
    } 
} 

Es ist sehr einfach - es schmückt nur die Methoden und die Eigenschaften ich unbedingt notwendig, aber man kann leicht hinzufügen, was fehlt ist.

Diese Klasse stellt sicher, dass das letzte Verzeichnis über verschiedene ShowDialog() s derselben Instanz bestehen bleibt; Wenn Sie jedoch das Programm herunterfahren, ist alles weg und das Betriebssystem entscheidet, was passiert, wenn Sie das nächste Mal starten. Es wäre cool, das Verzeichnis durch das Serialisieren/Deserialisieren zu/von einer Datei oder der Systemregistrierung noch beständiger zu machen.