SaveFileDialog/OpenFileDialog-Filter - Multiple Extensions

    • VB.NET

    Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      SaveFileDialog/OpenFileDialog-Filter - Multiple Extensions

      Hallo liebe Leute!

      Wer kennt das nicht? Man hat ein Programm gebastelt, man will eine Logdatei/XML-Datei abspeichern(oder öffnen). Was nimmt man da besseres her als den guten alten OpenFileDialog aus dem System.Windows.Forms-Namespace?

      So mancher hat sich bestimmt schon einmal gefragt, wie bspw Paint oder andere Programme es schaffen, mir mit ihrem OpenFileDialog(im Folgenden einfach nur OFD) mehrere verschiedene Dateien anzuzeigen, die zwar (theoretisch) unteschiedliche Endungen(=Extensions) haben, aber praktisch zur selben Dateiart gehören(Bilddateien *.jpg, *.jpeg, *.jpe).
      Nun, die Lösung ist einfach: mit multiplen Extensions für den Filter.

      Um das zu verwirklichen müsst ihr nur einen ganz normalen OFD(geht auch mit SaveFileDialog :D) erzeugen:

      VB.NET-Quellcode

      1. Dim ofd As OpenFileDialog = New OpenFileDialog()


      Dann gebt ihr dem OFD einen Filter mit, schreibt aber in den Kriterienbereich(=Endungsbereich (nach dem | ) durch ein Semikolon getrennt, die Endungen, die eure Zieldateien haben (darf - bei SFD).

      Also wenn man einen OpenFileDialog hat, mit den man JPG Dateien auswählen will, dann muss man in den Filter schreiben:

      VB.NET-Quellcode

      1. ofd.Filter = "JPEG-Dateien (*.jpg, *.jpeg, *.jpe, *.jfif) | *.jpg;*.jpeg;*.jpe;*.jfif"


      Das wichtige ist hierbei das ; (Semikolon) zwischen den Filterwerten nach dem Pipe-Zeichen( | )
      Wichtig ist aber auch, dass man zwischen dem Endungsstring(bspw. *.jpg und dem ; kein Leerzeichen lässt

      Eurer Radinator

      PS: Yeayyy mein erstes Tipps & Tricks und Tut's :D :thumbsup: :thumbsup:
      In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

      Hi, eigentlich schön erklärt.
      Ich fände cool wenn du dazu vielleicht eine kleine Klasse basteln könntest, die das ganze irgendwie verwaltet.
      Vielleicht mit Enums und alles schön einfach zu bedienen.
      So in etwa könnte man das ja vielleicht machen.

      VB.NET-Quellcode

      1. ​Public Class FileFilter
      2. Private _filters As New List(Of FilterItem)
      3. Public Sub Add(ByVal name As String, ByVal ParamArray extensions() As String)
      4. Dim fi As New FilterItem(name)
      5. fi.Extensions.AddRange(extensions)
      6. Me._filters.Add(fi)
      7. End Sub
      8. Public Overrides Function ToString() As String
      9. Dim output As String = String.Empty
      10. For Each fi As FilterItem In Me._filters
      11. output &= " " & fi.Name
      12. Dim extensions As String = String.Empty
      13. For Each extension As String In fi.Extensions
      14. extensions &= "*." & extension & ";"
      15. Next
      16. output &= "(" & extensions.Replace(";"c, "") & ") | " & extensions
      17. Next
      18. Return output
      19. End Function
      20. Private Class FilterItem
      21. Public Property Name As String
      22. Public Property Extensions As New List(Of String)
      23. Public Sub New(ByVal name As String)
      24. Me.Name = name
      25. End Sub
      26. End Class
      27. End Class


      VB.NET-Quellcode

      1. ​Using ofd As New OpenFileDialog()
      2. Dim filter As New FileFilter()
      3. filter.Add("Bilder", "jpg", "jpeg", "jpe")
      4. ofd.Filter = filter.ToString()
      5. ofd.ShowDialog()
      6. End Using
      Hallo LaMiy!

      Danke dir für deine Anregung, hab deinen Vorschlag auch schon in die Tat umgestzt. Im Anhang befindet sich dann die Lib, mit der man den Filter ganz einfach bedienen kann.

      Ich werd die Lib evtl - sofern gewünscht - auch im Showroom aushängen.

      Klassendiagramm:

      VB.NET-Quellcode

      1. Namespace EasyFileDialogFilter
      2. Public Class EasyFileDialogFilter
      3. Private _filter As New List(Of FilterItem)
      4. Public Sub Add(ByVal type As String, ByVal ParamArray extensions() As String)
      5. Public Function MergeFilter() As String
      6. End Class
      7. Friend Class FilterItem
      8. Public Property FileType As String
      9. Public Property Extensions As New List(Of String)
      10. Public Sub New(type As String)
      11. End Class
      12. End Namespace


      How to Use:

      VB.NET-Quellcode

      1. Dim efdf As New EasyFileDialogFilter.EasyFileDialogFilter 'Instanzierung
      2. efdf.Add("Bilder", "jpg", "jpe") 'Der Add-Metode werden die Bezeichung(Bilder)und
      3. 'anschließen die Endungen (OHNE "*" und ".")
      4. 'übergeben
      5. efdf.Add("Text Dateien" "txt", "log")
      6. Dim ofd As New OpenFileDialog()
      7. If ofd.ShowDialog = DialogResult.OK Then
      8. MessageBox.Show(ofd.FileName)
      9. End If


      Besonderen Dank an @LaMiy, der mich auf auf EasyFileDialogFilter gebracht hat!

      Hoffe ich konnte einigen helfen :D

      Euer Radinator
      Dateien
      In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Radinator“ ()

      ich für mein Teil finde die Tipp-Erweiterungen bisserl übertrieben.
      Imo ist OpenFileDialog für den Designer ausgelegt, also son Ding zieht man aus der Toolbox aufs Form, trägt im EigenschaftenFenster den richtigen Filter ein und fertig.
      Kein Code zu schreiben, keine Zusatz-Klasse oder gar Dll - nichtmal das mit dem Using-Block.
      Sondern man muss halt nur ggfs. die richtige Syntax des Filter-Ausdrucks nochmal nachgucken - und die ist in post#1 ja gut erklärt. :thumbup:
      Danke @ErfinderDesRades für dein Lob.

      Mir ist schon klar, dass der OpenFileDialog eher für den Designer ausgelegt ist und man desshalbt auch "einfach" den Filter einfügen kann. Aber eben auch nur "einfach", denn mir ist das schon oft genug passiert, dass ich da mal den | veressen hab und wenn man den vergiss, tja, dann fröhliches Throw New WasWeißIchExceptionen.

      Meine ursprüngliche Intuitin war es ja auch nur zu zeigen, wie man das richtig hernimmt. Dass mich dann @LaMiy auf die DLL gebraucht hat, bzw mir schon mal 80% angenommen hat, das war halt einfach nur das Ergebnis aus Vorschlag und Umsetzung.
      Natürlich braucht keiner meine DLL, aber wer sich halt ein wenig Arbeit und fummelei ersparen will, kann sie gerne hernehmen

      IMHO ist eine Kombination aus OFD, erzeugt vom Designer, und InCode bearbeiten des Filters das beste :D

      Mfg Radinator
      In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

      ErfinderDesRades schrieb:

      also son Ding zieht man aus der Toolbox aufs Form
      aber nur dann, wenn Du genau eine Extension verwaltest.
      Bei 2 Extensions die jedes Mal zu aktualisieren oder gar 2 OFD auf die Form zu ziehen wäre glatt übertrieben, da zieh ich doch die Using-Syntax vor.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!