2016-06-17 9 views
0

私はいくつかの異なるパスからファイルを使用しているプログラム(C#、.Net 4.5、WPF)を持っています。ユーザーがそのファイルタイプの場所を参照できるように、それぞれのOpenFileDialogを、最後に使用されたディレクトリとは別に追跡することを期待してインスタンス化しました。openfiledialogsの干渉とディレクトリが残る

//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の両方に設定しようとしました。

どのようにして異なるファイルダイアログを自分のディレクトリを覚えていても、セッション間で持続しないようにすることができますか?

+0

できません。同じ場所から次のファイルを開きたいと思っているOSと戦っている。あなたはこの議論に勝つことはできません。 –

+0

2つのダイアログが別々のフォルダで開きますので、ここで何か別のダイアログが表示されます。誰かが私がサブクラス化できる、またはこの機能を持つオープンソースのファイルブラウザクラスを作ったことがありますか? – Matt

答えて

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()にまたがって最後のディレクトリが存続することを確認します。しかし、プログラムを終了すると、すべてがなくなり、OSは次に起動するときに何が起こるかを決定します。ファイルやシステムレジストリとの間でシリアライズ/デシリアライズを行うことで、ディレクトリをより永続的にすることはクールです。

関連する問題