1

アプリケーションでFolderBrowserをユーザーに表示してから、m_dialog.Style = FolderBrowserStyles.ShowTextBox;を持つShowDialog()を使用してユーザーをプロモートします。したがって、ユーザーが選択したいフォルダーのパスを手動で入力できるようにします。

問題は、ユーザーが存在しないフォルダーのパスを入力して[OK]をクリックすると、ダイアログがデフォルトのDirectoryPath値で戻ることです。必要なのは、選択したフォルダーを作成し(存在しない場合は、最初にユーザーを昇格させることによって)、次にDirectoryPathプロパティ内に(現在有効な)パスを設定することです。

それを行う方法はありますか?

4

1 に答える 1

1

FolderNameEditor.FolderBrowserクラスは、SHBrowseForFolderシェル関数を利用します。ユーザーが無効なパスを入力した場合のデフォルトの機能は、デフォルトで選択されたアイテム(この場合はデスクトップフォルダー)を返すことです。

SHBrowseForFolderシェル関数は、BROWSEINFO(構造)型の引数を想定しています。

この構造により、コールバック関数(イベントが発生したときにダイアログボックスが呼び出すアプリケーション定義関数へのポインター)を定義できます。このコールバックでは、必要なことを達成できる可能性があります。

FolderBrowserがこのシェル関数を呼び出すと、このコールバック関数はnullに設定されるため、FolderNameEditorクラスを使用して必要なものを実現する方法はありません。

ただし、コードプロジェクトには、SHBrowseForFolderを使用し、イベントコールバックをラップして、イベント(OnValidateFailed)を介して無効なフォルダーエントリへのアクセスを提供するライブラリがあります。参照:C#はシェルを実行します、パート1

このイベント内で(ユーザーが何でも入力できるため)、入力したパスを使用してディレクトリを作成できます。

次に例を示します。

using ShellLib;

...

public class OpenFolderDialog
{
    ShellBrowseForFolderDialog folderDialog;
    string selectedPath;

    public OpenFolderDialog()
    {
        folderDialog = new ShellBrowseForFolderDialog();
        folderDialog.OnValidateFailed += new ShellBrowseForFolderDialog.ValidateFailedHandler(dialog_OnValidateFailed);
    }

    int dialog_OnValidateFailed(ShellBrowseForFolderDialog sender, ShellBrowseForFolderDialog.ValidateFailedEventArgs args)
    {
        selectedPath = args.invalidSel;

        //Use selectedPath here to create the directory.

        return 0;
    }

    public string GetFolder()
    {
        selectedPath = string.Empty;
        folderDialog.ShowDialog();

        return selectedPath == string.Empty ? folderDialog.FullName : selectedPath;
    }
}

お役に立てれば。

于 2011-09-21T14:33:05.557 に答える