حدد ملف أو مجلد من نفس الحوار .صافي
-
06-07-2019 - |
سؤال
هل هناك "سهلة" طريقة لتحديد إما ملف أو مجلد من نفس الحوار ؟
في العديد من التطبيقات لا خلق أسمح لكل الملفات أو المجلدات كما الإدخال.حتى الآن أنا دائما في نهاية المطاف إنشاء مفتاح للتبديل بين الملف أو المجلد اختيار الحوارات أو عصا مع السحب والإفلات وظيفة فقط.
لأن هذا يبدو مثل هذا الشيء الأساسي أتصور هذا وقد تم إنشاؤه من قبل ، ولكن غوغلينغ لا يؤدي إلى الكثير من المعلومات.لذا يبدو أني سوف تحتاج إلى البدء من الصفر و إنشاء مخصص الحوار اختيار, ولكن أنا أفضل عدم إدخال أي المشاكل عن طريق إعادة اختراع العجلة هذه مهمة تافهة.
أي شخص أي نصائح أو القائمة حلول ؟
للحفاظ على واجهة المستخدم ثابت أنه سيكون من الرائع إذا كان من الممكن تمديد OpenFileDialog (أو FolderBrowserDialog).
المحلول
ومن الناحية الفنية، فمن الممكن. الحوار قذيفة يستخدمها FolderBrowseDialog لديه القدرة على العودة كل الملفات والمجلدات. للأسف، لم يتم كشفها تلك القدرة في .NET. ولا حتى التفكير يمكن أن يظهر العلم الخيار المطلوب.
لجعلها تعمل، وكنت قد لP / استدعاء SHBrowseForFolder () مع العلم BIF_BROWSEINCLUDEFILES تشغيل في BROWSEINFO.ulFlags (القيمة = 0x4000). وP / استدعاء هو شجاع، فمن الأفضل لنسخ ولصق رمز من <لأ href = "http://www.google.com/search؟hl=en&q=shbrowseforfolder+structlayout&btnG=Google+Search&aq=f&oq=" يختلط = "noreferrer"> مصدر آخر أو الطبقة FolderBrowseDialog نفسها بمساعدة العاكس ل.
نصائح أخرى
وبناء على النصائح أعلاه لقد وجدت بعض التعليمات البرمجية تعمل يستخدم الحوار متصفح مجلد القياسية في الموقع التالي: <لأ href = "http://topic.csdn.net/t/20020703/05/845468.html" يختلط = "noreferrer"> http://topic.csdn.net/t/20020703/05/845468.html
ومن الدرجة الاولى للحوار موسع متصفح مجلد
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
ورمز لتنفيذ الحوار الموسع
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
ويمكنك استخدام OpenFileDialog القياسية لتحديد مجلد. هنا مقالة في CodeProject التي أظهرت طريقة للقيام بذلك ( HTTP: // شبكة الاتصالات العالمية. codeproject.com/KB/dialog/OpenFileOrFolderDialog.aspx ).
وتم القيام به. يمكنك استخدام FolderBrowserDialogEx - ويمكن إعادة استخدامها مشتق من FolderBrowserDialog المضمنة. هذا واحد يسمح لك اكتب في مسار، حتى مسار UNC. يمكنك تصفح المجلدات أو الملفات + المجلدات. يمكنك تصفح لأجهزة الكمبيوتر أو الطابعات معها. وبناء على FBD في البناء، ولكن ... على نحو أفضل. أكثر مرونة. إذا قمت بالنقر فوق مجلد في واجهة المستخدم الرسومية، يظهر المسار في مربع النص. إذا كنت رئيسيا في مسار، ويحصل على activatied المجلد. الكثير من الخيارات يفتقر إلى الحوار المضمنة.
وشفرة المصدر كامل. مجانا. رخصة MS-العام.
ورمز لاستخدامه:
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;
}
AFAIK, لا يوجد شيء في .NET framework أن يفعل هذا في الخروج من مربع.
على .صافي ملف الحوارات تستمد من CommonDialog:
ورثت الفصول المطلوبة تنفيذ RunDialog بالتذرع ShowDialog لخلق مشترك معين في مربع الحوار.ورثت الطبقات يمكن تجاوز HookProc لتنفيذ محددة في مربع الحوار ربط وظائف.
وجميع من بني في الحوارات استخدام ال API قذيفة التي تتوافق مع عملها، PrintDialog، OpenFileDialog، SaveFileDialog، الخ ...
وأنت سوف يكون على الأرجح لبناء هذه الوظيفة يدويا.
http://www.pinvoke.net/default.aspx/shell32.shbrowseforfolder
هنا هو gerat الرابط إذا كنت تغيير في هذه العينة
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE;
بالنسبة
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE | BIF_BROWSEINCLUDEFILES;
سوف تحصل على ما تريد
إذا كنت ترغب في عرض أنواع الملفات معينة فقط، ما يلي <لأ href = "http://www.codeproject.com/KB/shell/csdoesshell1.aspx؟fid=14137&df=90&mpp=25&noise=3&sort=Position&view = سريعة والاب = 26 "يختلط =" نوفولو noreferrer "> المقالة (مع شفرة المصدر في C #) يمكن أن تساعدك على:
وهذا ما يفسر أيضا الخيارات الأخرى المتوفرة ل "تخصيص" الحوار FolderBrowser،
وهذا سوف يسمح لك لتحديد المجلدات باستخدام OpenFileDialog
openFileDialog1.CheckFileExists = false;
openFileDialog1.ValidateNames = false;
على Ookii الحوارات تنفيذ مجلد المتصفح الحوار التي تسمح لكل الملفات أو المجلدات كمدخل ، وهو متاح على نظام ويندوز أشكال WPF.
Ookii.الحوارات.Wpf
Ookii.الحوارات.WinForms