9

ユーザーが入力したファイル名に拡張子を付けて適用しようとしSaveFileDialogています。質問 389070FileOpenDialogで提案されたサンプルを使用してみましたが、意図したとおりに動作しません。

var dialog = new SaveFileDialog())

dialog.AddExtension = true;
dialog.DefaultExt = "foo";
dialog.Filter = "Foo Document (*.foo)|*.foo";

if (dialog.ShowDialog() == DialogResult.OK)
{
    ...
}

testユーザーがたまたまファイルが存在するフォルダーにテキストを入力test.xmlすると、ダイアログは名前を提案しますtest.xml(実際*.fooにはリストでのみ表示したいのですが)。さらに悪いことに、ユーザーが を選択test.xmlすると、実際にtest.xml出力ファイル名として取得されます。

SaveFileDialogユーザーがファイルを選択できるようにするにはどうすればよい*.fooですか? または、少なくとも、ユーザーがクリックしたときに拡張機能を置き換え/追加することはありますSaveか?

ファイル名の拡張子が間違っている場合はボタンFileOkを無効にしたいので、提案された解決策(イベントハンドラーを実装する)は仕事の一部しか実行しません。Save

ダイアログにとどまり、ハンドラーのテキスト ボックスに表示されるファイル名更新FileOkし、新しいファイル名を正しい拡張子で反映するには、次の関連する質問を参照してください。

4

5 に答える 5

17

イベントを処理しFileOk、正しい拡張子でない場合はキャンセルできます

private saveFileDialog_FileOk(object sender, CancelEventArgs e)
{
    if (!saveFileDialog.FileName.EndsWith(".foo"))
    {
        MessageBox.Show("Please select a filename with the '.foo' extension");
        e.Cancel = true;
    }
}
于 2009-11-02T14:23:49.963 に答える
3

私の知る限り、特定のファイル拡張子を強制する信頼できる方法はありません。とにかく、ダイアログが閉じられたら正しい拡張子を確認し、拡張子が一致しない場合は無効なファイルを選択したことをユーザーに通知することをお勧めします。

于 2009-10-21T06:36:03.160 に答える
0

私はこれと同じ問題に遭遇し、次のことを行うことで表示内容を制御することができました。

OpenFileDialogでは、フィルター文字列の最初の項目がデフォルトでした

openFileDialog1.Filter = "Program x Files (*.pxf)|*.pxf|txt files (*.txt)|*.txt";
openFileDialog1.ShowDialog();

SaveFileDialogでは、フィルターの2番目の項目がデフォルトとして使用されました。

SaveFileDialog saveFileDialog1 = new SaveFileDialog();

saveFileDialog1.Filter = "txt files (*.txt)|*.txt|Program x Files (*.pxf)|*.pxf";
saveFileDialog1.FilterIndex = 2;
saveFileDialog1.RestoreDirectory = true;

if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
    if (saveFileDialog1.FileName != null)
    {
        // User has typed in a filename and did not click cancel
        saveFile = saveFileDialog1.FileName;
        MessageBox.Show(saveFile);
        saveCurrentState();

    }
} 

これらの2つのフィルターをそれぞれのfileDialogsで使用した後、期待される結果が最終的に発生しました。デフォルトでは、ユーザーが保存ボタンを選択してsavefiledialogが表示された場合、選択されたファイルタイプは、savefiledialogのフィルターで定義されたプログラムXファイルタイプのファイルタイプです。同様に、openfiledialogに選択されたファイルタイプは、openfileDialogのフィルターで定義されたプログラムXファイルタイプのファイルタイプです。

このスレッドで前述したように、入力の検証を行うこともできます。どちらもfiledialogクラスを継承しているにもかかわらず、2つのダイアログ間でフィルターが異なっているように見えることを指摘したいと思います。

于 2012-02-19T04:55:43.540 に答える
0

これに最も近いのは、FileOk イベントを使用することです。例えば:

dialog.FileOk += openFileDialog1_FileOk;

private void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
  if(!dialog.FileName.EndsWith(".foo"))
  { 
     e.Cancel = true;
  }
}

MSDNの FileOK イベントをチェックアウトします。

于 2009-11-02T14:26:24.450 に答える
-1
    //this must be ran as administrator due to the change of a registry key, but it does work...

    private void doWork()
    {
        const string lm = "HKEY_LOCAL_MACHINE";
        const string subkey = "\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\AutoComplete";
        const string keyName = lm + subkey;

        int result = (int)Microsoft.Win32.Registry.GetValue(keyName, "AutoComplete In File Dialog", -1);

        MessageBox.Show(result.ToString());

        if(result.ToString() == "-1")
        {
            //-1 means the key does not exist which means we must create one...
            Microsoft.Win32.Registry.SetValue(keyName, "AutoComplete In File Dialog", 0);
            OpenFileDialog ofd1 = new OpenFileDialog();
            ofd1.ShowDialog();
        }
        if (result == 0)
        {
            //The Registry value is already Created and set to '0' and we dont need to do anything
        }
    }
于 2012-02-25T03:00:07.753 に答える