2011-09-21 2 views
1

내 응용 프로그램에서 사용자에게 FolderBrowser를 보여주고 m_dialog.Style = FolderBrowserStyles.ShowTextBox가있는 ShowDialog()로 승격시킵니다. 따라서 사용자가 선택할 폴더의 경로를 수동으로 입력 할 수 있습니다.FolderBrowserStyles.ShowTextBox가있는 FolderNameEditor.FolderBrowser - TextBox.Text에서 새 폴더를 자동으로 만듭니다.

문제는 사용자가 존재하지 않는 폴더의 경로를 입력하고 확인을 클릭하면 대화 상자가 일부 기본 DirectoryPath 값을 반환한다는 것입니다. 내가 원하는 것은 선택한 폴더를 생성하고 (존재하지 않고 사용자를 먼저 승격시킴으로써) DirectoryPath 속성 내에 (현재 유효한) 경로를 갖는 것입니다.

어떻게해야합니까?

+0

WinForms ['FolderBrowserDialog'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.folderbrowserdialog.aspx) 클래스에는' FolderBrowserStyles' 값 ... 실제로 어떤 수업을 사용하고 있습니까? –

+0

http://msdn.microsoft.com/en-us/library/system.windows.forms.design.foldernameeditor.folderbrowser%28v=VS.90%29.aspx – galbarm

+0

보호 된 중첩 된 봉인 된 클래스입니다. 당신은 그것을 얻기 위해 반사를 해킹하고 있습니까? –

답변

1

FolderNameEditor.FolderBrowser 클래스는 SHBrowseForFolder 셸 함수를 사용합니다. 잘못된 경로를 입력하는 사용자의 기본 기능은 기본 선택된 항목 (이 경우 Desktop 폴더)을 반환하는 것입니다.

SHBrowseForFolder 셸 함수는 BROWSEINFO (구조체) 인수를 필요로합니다.

이 구조는 콜백 함수 (이벤트가 발생할 때 대화 상자에서 호출하는 응용 프로그램 정의 함수에 대한 포인터)의 정의를 허용하며 사용자가 필요로하는 것을 달성 할 가능성이있는 것은이 콜백에 있습니다.

이 콜백 함수는 FolderBrowser가이 셸 함수를 호출 할 때 null로 설정되므로 FolderNameEditor 클래스를 사용하여 필요한 것을 성취 할 수있는 방법이 없습니다.

그러나 codeproject에는 SHBrowseForFolder를 사용하고 이벤트 콜백을 래핑하여 이벤트 (OnValidateFailed)를 통해 잘못된 폴더 항목에 대한 액세스를 제공하는 라이브러리가 있습니다. 참조 : C# does Shell, Part 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; 
    } 
} 

희망 : 여기

은 예입니다.

+0

감사합니다. 나는 그것을 할 수있는 직접적인 방법이 없다고 생각했다. 당신은 답을 얻는 가장 좋은 방법 인 것처럼 보입니다. – galbarm