openfiledialogs干扰和目录持续存在

时间:2016-06-17 02:55:59

标签: c# openfiledialog

我有一个程序(C#,。Net 4.5,WPF),它使用来自几个不同路径的文件。为了允许用户浏览到该文件类型的位置,我为每个文件实例化了一个不同的OpenFileDialog,希望每个OpenFileDialog分别跟踪其最后使用的目录。

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

这似乎间歇性地起作用。有时当我从一个文件对话框(wordFileDlg)中选择一个文件时,下次打开另一个文件对话框(excelFileDlg)时,该目录已更改为最后选择的wordFileDlg目录。反过来说不是这样。为什么会这样做?

我将初始目录属性设置为默认值,但即使是最后一个目录似乎也会在会话中保持不变。我将restoreDirectory属性设置为false我打开程序,浏览一些文件并关闭程序。我再次打开程序,浏览器不会将我带到初始目录,而是回到最后选择的目录。怎么知道呢?我似乎无法找到打开特定目录的文件对话框的方法。我已经尝试将RestoreDirectory设置为true和false。

如何让不同的文件对话框记住自己的目录,而不是在会话中保持不变,我可以设置它打开的目录吗?

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但我自己偶然发现了类似的问题(虽然更简单)。

我担心你无法真正得到你想要的东西 - 但是你可以很容易地拥有一个字符串变量来存储你应该去的目录。你可以将它封装成一个类,瞧!,你已经得到了你需要的东西。

这是我的班级:

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

这是非常基本的 - 它只装饰我严格需要的方法和属性,但你可以轻松添加缺少的东西。

此类确保最后一个目录在同一实例的不同ShowDialog()之间保持不变;然而,当你关闭程序时,一切都已消失,操作系统将决定你下次启动时会发生什么。通过序列化/反序列化文件或系统注册表来使目录更加持久是很酷的。