Select either a file or folder from the same dialog in .NET

后端 未结 10 2036
别跟我提以往
别跟我提以往 2020-12-01 10:14

Is there an \"easy\" way to select either a file OR a folder from the same dialog?

In many apps I create I allow for both files or folders as input. Until now i alwa

相关标签:
10条回答
  • 2020-12-01 10:57

    http://www.pinvoke.net/default.aspx/shell32.shbrowseforfolder

    here is gerat link if you change in this sample

      bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE;
    

    for

      bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE | BIF_BROWSEINCLUDEFILES;
    

    you will get what you want

    0 讨论(0)
  • 2020-12-01 11:03

    All of the built in dialogs use the shell API's that correspond to their action, PrintDialog, OpenFileDialog, SaveFileDialog, etc...

    You would most likely have to manually build this functionality.

    0 讨论(0)
  • 2020-12-01 11:06

    It's been done. You can use FolderBrowserDialogEx - a re-usable derivative of the built-in FolderBrowserDialog. This one allows you to type in a path, even a UNC path. You can browse for folders, or files+folders. You can browse for computers or printers with it. Based on the built-in FBD, but ... better. More flexible. If you click a folder in the GUI, the path appears in the textbox. If you key in a path, the folder gets activatied. Lots of options the built-in dialog lacks.

    Full Source code. Free. MS-Public license.

    Code to use it:

         var dlg1 = new Ionic.Utils.FolderBrowserDialogEx();
         dlg1.Description = "Select a folder to extract to:";
         dlg1.ShowNewFolderButton = true;
         dlg1.ShowEditBox = true;
         //dlg1.NewStyle = false;
         dlg1.SelectedPath = txtExtractDirectory.Text;
         dlg1.ShowFullPathInEditBox = true;
         dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer;
    
         // Show the FolderBrowserDialog.
         DialogResult result = dlg1.ShowDialog();
         if (result == DialogResult.OK)
         {
             txtExtractDirectory.Text = dlg1.SelectedPath;
         }
    
    0 讨论(0)
  • 2020-12-01 11:07

    Based on the above tips I found some working code that uses the standard Folder Browser dialog at the following location: http://topic.csdn.net/t/20020703/05/845468.html

    The Class for the extended Folder Browser Dialog

    Imports System   
    Imports System.Text   
    Imports System.Windows.Forms   
    Imports System.Runtime.InteropServices   
    
    Public Class DirectoryDialog 
        Public Structure BROWSEINFO 
            Public hWndOwner As IntPtr 
            Public pIDLRoot As Integer 
            Public pszDisplayName As String 
            Public lpszTitle As String 
            Public ulFlags As Integer 
            Public lpfnCallback As Integer 
            Public lParam As Integer 
            Public iImage As Integer 
        End Structure 
    
        Const MAX_PATH As Integer = 260
    
        Public Enum BrowseForTypes As Integer 
            Computers = 4096 
            Directories = 1 
            FilesAndDirectories = 16384 
            FileSystemAncestors = 8 
        End Enum 
    
        Declare Function CoTaskMemFree Lib "ole32" Alias "CoTaskMemFree" (ByVal hMem As IntPtr) As Integer 
        Declare Function lstrcat Lib "kernel32" Alias "lstrcat" (ByVal lpString1 As String, ByVal lpString2 As String) As IntPtr 
        Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolder" (ByRef lpbi As BROWSEINFO) As IntPtr 
        Declare Function SHGetPathFromIDList Lib "shell32" Alias "SHGetPathFromIDList" (ByVal pidList As IntPtr, ByVal lpBuffer As StringBuilder) As Integer 
        Protected Function RunDialog(ByVal hWndOwner As IntPtr) As Boolean 
    
            Dim udtBI As BROWSEINFO = New BROWSEINFO() 
            Dim lpIDList As IntPtr 
            Dim hTitle As GCHandle = GCHandle.Alloc(Title, GCHandleType.Pinned) 
            udtBI.hWndOwner = hWndOwner 
            udtBI.lpszTitle = Title 
            udtBI.ulFlags = BrowseFor 
            Dim buffer As StringBuilder = New StringBuilder(MAX_PATH) 
            buffer.Length = MAX_PATH 
            udtBI.pszDisplayName = buffer.ToString() 
            lpIDList = SHBrowseForFolder(udtBI) 
            hTitle.Free() 
            If lpIDList.ToInt64() <> 0 Then 
                If BrowseFor = BrowseForTypes.Computers Then 
                    m_Selected = udtBI.pszDisplayName.Trim() 
                Else 
                    Dim path As StringBuilder = New StringBuilder(MAX_PATH) 
                    SHGetPathFromIDList(lpIDList, path) 
                    m_Selected = path.ToString() 
                End If 
                CoTaskMemFree(lpIDList) 
            Else 
                Return False 
            End If 
            Return True 
        End Function 
    
        Public Function ShowDialog() As DialogResult 
            Return ShowDialog(Nothing) 
        End Function 
    
        Public Function ShowDialog(ByVal owner As IWin32Window) As DialogResult 
            Dim handle As IntPtr 
            If Not owner Is Nothing Then 
                handle = owner.Handle 
            Else 
                handle = IntPtr.Zero 
            End If 
            If RunDialog(handle) Then 
                Return DialogResult.OK 
            Else 
                Return DialogResult.Cancel 
            End If 
        End Function 
    
        Public Property Title() As String 
            Get 
                Return m_Title 
            End Get 
            Set(ByVal Value As String) 
                If Value Is DBNull.Value Then 
                    Throw New ArgumentNullException() 
                End If 
                m_Title = Value 
            End Set 
        End Property
    
        Public ReadOnly Property Selected() As String 
            Get 
                Return m_Selected 
            End Get 
        End Property 
    
        Public Property BrowseFor() As BrowseForTypes
            Get 
                Return m_BrowseFor 
            End Get 
            Set(ByVal Value As BrowseForTypes) 
                m_BrowseFor = Value 
            End Set 
        End Property 
    
        Private m_BrowseFor As BrowseForTypes = BrowseForTypes.Directories 
        Private m_Title As String = "" 
        Private m_Selected As String = "" 
    
        Public Sub New() 
        End Sub
    End Class 
    

    The code to implement the extended dialog

    Sub Button1Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim frmd As DirectoryDialog = New DirectoryDialog()
        ' frmd.BrowseFor = DirectoryDialog.BrowseForTypes.Directories   
        ' frmd.BrowseFor = DirectoryDialog.BrowseForTypes.Computers   
        frmd.BrowseFor = DirectoryDialog.BrowseForTypes.FilesAndDirectories   
        frmd.Title = "Select a file or a folder"    
        If frmd.ShowDialog(Me) = DialogResult.OK Then   
            MsgBox(frmd.Selected)   
        End If   
    End Sub
    
    0 讨论(0)
  • 2020-12-01 11:08

    If you would like to display only specific file types, the following article (with source code in C#) can help you:

    http://www.codeproject.com/KB/shell/csdoesshell1.aspx?fid=14137&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26

    It also explains the other options that are available for "customizing" the FolderBrowser dialog,

    0 讨论(0)
  • 2020-12-01 11:12

    this will allow you to select folders using OpenFileDialog

            openFileDialog1.CheckFileExists = false;
            openFileDialog1.ValidateNames = false;
    
    0 讨论(0)
提交回复
热议问题