Selbst erstellter OpenFileDialog?

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Selbst erstellter OpenFileDialog?

    Hi,

    ich suche seit fast einer Stunde im Netz nach einem Link, bei dem ich dachte ihn mir in meinen Lesezeichen gespeichert zu haben...leider finde ich ihn nicht wieder, aber vielleicht könnt ihr mir ja so helfen:

    Ich würde gerne einen "eigenen" 'OpenFileDialog' erstellen.
    (Er soll automatisch die Ordner des ausgewählten Verzeichnisses nach einer .ini durchsuchen, in der Daten stehen, die in der Dateiauswahl anklickbar angezeigt werden...
    Der OpenFileDialog, den ich bisher im Programm habe, zeigt die Daten aus der .ini natürlich nicht an und man muss, zwischen den ganzen Ordnern immer die korrekte Datei finden...)

    Damit ihr wisst, was ich meine(das stammt aus einem anderen Programm):


    Es würde mir schon sehr helfen, wenn ich wüsste, wie das Ding überhaupt heißt...
    Du kannst z.B in einer Listbox mit:

    VB.NET-Quellcode

    1. For Each pa As System.IO.DirectoryInfo In di.GetDirectories
    2. ListBox1.Items.Add("[Folder] " & pa.ToString)
    3. Next
    4. For Each fi As System.IO.FileInfo In di.GetFiles
    5. ListBox1.Items.Add("[File] " & fi.ToString)
    6. Next


    Ordner und Dateien eines Ordners oder einer Festplatte in die Listbox schreiben
    (natürlich bei jedem mal clearen).


    EDIT: Für die INI Datei kannst du es so machen, dass das File nur in die Listbox kommt,
    wenn es .ini enthällt

    Mit ein bischen werkeln wird daraus ein Open file dialog

    Mfg
    Wenn schon DirectoryInfo, warum dann nicht die DataSource der ListBox nutzen, @Kilian_98:?
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hi,

    ich frag mich, wozu's hier einen eigenen OpenFileDialog braucht. Das alles kannst du doch auch mit einem fertigen OpenFileDialog machen, und dabei die Filter-Eigenschaft so nutzen, dass nur .INI-Dateien gefunden werden.
    Ganz einfach:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim ofd As New OpenFileDialog
    4. ofd.Filter = "INI-Dateien (*.ini)|*.ini|Alle Dateien (*.*)|*.*"
    5. ofd.Title = "INI-Datei öffnen"
    6. If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then
    7. MsgBox("Datei ausgewählt:" & vbNewLine & ofd.FileName.ToString)
    8. End If
    9. End Sub
    10. End Class



    Link :thumbup:
    Hello World

    Link275 schrieb:

    ich frag mich, wozu's hier einen eigenen OpenFileDialog braucht.

    Moin,
    ich kann mich irren, aber ich verstehe seine Anforderungen anders - nämlich so:
    Links im Bild wird ein Startverzeichnis ausgewählt, vom dem aus rekursiv alle Unterverzeichnisse nach ".ini" abgesucht und in der Liste (Bildmitte) zur Auswahl angeboten werden.
    Stimmts?

    LG,
    Bruno
    Hi,

    gut möglich dass er auch das gemeint hat. Ich hab's halt so verstanden, dass er den Begriff "suchen" gewählt hat, weil er gemeint hat dass nur INI-Dateien angezeigt werden sollen. Weil, wenn ich mir oben das Bild ansehe (im Einfangsposting) dann sehe ich dort auch keine Funktion die Dateien sucht, man muss sich auch manuell durchklicken.
    Und damit man sich die Arbeit spart dachte ich eben das geht ja ganz unkompliziert und einfach auch mit einem OpenFileDialog von VisualStudio und dem dafür passenden Filter zur Anzeige bestimmter Dateitypen.


    Link :thumbup:
    Hello World
    Da bin ich wieder :)

    Also ich erkläre es mal genauer:
    Ich habe ein Programm, das auf bestimmte Access-Datenbanken(.mdb) zugreift. In dem Ordner in der sich auch die Datenbank befindet, befinden sich noch viele andere Dateien. (Ordner, .ini Dateien, eine .chr-Datei).
    Durch den OpenFileDialog habe ich die Möglichkeit, nur bestimmte Dateientypen anzeigen zu lassen. Ordner sieht man aber weiterhin.
    Zudem stehen in der .ini (die sich im gleichen Ordner befindet wie die .mdb) wichtige Informationen zu der jeweiligen Datenbank, die ich im OpenFileDialog nicht darstellen kann.

    Habe ich beispielsweise mehrere Ordner mit Datenbanken auf dem Desktop und wähle mit dem eigenen OpenFileDialog den Desktop aus, soll er alle Ordner auf dem Desktop nach .ini- oder/und .mdb-Dateien durchsuchen und in einer ListBox die Daten aus der .ini darstellen. Doppelklicke ich darauf, soll er ebenjenen Datenbankpfad für das Öffnen/Darstellen der Datenbank verwenden.

    Bisher habe ich einen TreeView dazu gebracht mir die Ordnerstruktur der einzelnen Laufwerke preiszugeben.
    Ein Codebeispiel dazu gibt's hier:
    vbarchiv.net/tipps/tipp_1587-e…-treeview-fuer-vbnet.html

    Jetzt muss ich noch ausprobieren, womit ich den ausgewählten TreeView-Pfad abrufen kann, um dann in den Ordnern dieses Ordners(ist das dieses rekursive ermitteln?) nach der .ini-Datei suchen zu können...
    Ich schätze mal dass Abrufen des Pfads in etwa so geht:

    VB.NET-Quellcode

    1. Dim pfad As String
    2. pfad = tvpfad.SelectedPath


    Edit: Es scheint so zu gehen:

    VB.NET-Quellcode

    1. pfad = tvpfad.SelectedNode.FullPath

    Nur gibt er mir z.B. "C:\\" statt "C:\" aus lässt sich das irgendwie einfach lösen, oder muss ich das erst auseinander schnippeln und wieder zusammensetzen?

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

    Hi,

    das ist deswegen so, weil der Knoten ("C:\") als einziger ein "\" am Ende hat. Du könntest ja einfach das ersetzen, also:

    VB.NET-Quellcode

    1. Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
    2. Dim pfad As String = TreeView1.SelectedNode.FullPath.ToString
    3. pfad = pfad.Replace("\\\\\", "\\\\")
    4. MsgBox(pfad)
    5. End Sub


    Link :thumbup:
    Hello World
    @Rasalas:: Es ist dem Windows egal, ob da "/", "\" oder "\\" als Pfad-Trennzeichen drinsteht, er macht alles richtig.
    Wenn Du Hand daran legst, solltest Du auch die "/" durch "\" ersetzen, falls ein User solch manuell vorgibt / vorgeben kann:

    VB.NET-Quellcode

    1. pfad = pfad.Replace("", "")
    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!
    Ich habe folgenden Code, um erstmal den Pfad zu den Dateien in die Listbox einzutragen:

    VB.NET-Quellcode

    1. Dim File As String
    2. Dim Path As String
    3. ' ggf. abschließenden Backslash hinzufügen
    4. If Not Path.EndsWith("[BackSlash]") Then Path += "[BackSlash]"
    5. lstBox.Items.Clear()
    6. For Each sFile In My.Computer.FileSystem.GetFiles( _
    7. sPath, FileIO.SearchOption.SearchTopLevelOnly, "*.SCF")
    8. lstBox.Items.Add(sFile)
    9. Next


    Dabei tauchen 2 Probleme auf:
    1. Mit "FileIO.SearchOption.SearchAllSubDirectories":
    Wenn ein Anwender z.B. seinen User Ordner im Treeview auswählt, stürzt das Programm ab, weil der Ordner "C:\Users\MeinName\Anwendungsdaten" schreibgeschützt ist. Kann ich das nur mit einem Try-Catch Befehl abfangen?
    Kann ich die Tiefe der Suche irgendwie beschränken?
    2. Mit "FileIO.SearchOption.SearchTopLevelOnly" muss ich die Archivordner selbst auswählen. Ich würde das gerne so machen, dass man nur den Ordner der Archive auswählen muss.
    Die Ordner in denen sich die Archive befinden, enden alle mit ".SCF", also dachte ich, dass das mit .SearchTopLevelOnly klappt, aber irgendwie wirft das Programm mit dem Suchstring "*.SCF" nichts aus :/ (weils ein Ordner ist?)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Rasalas“ ()

    1. es empfiehlt sich, versteckte Ordner erst garnet anzuzeigen im Treeview. ansonsten ja: der UnauthorisizedAccessException kommt man eiglich nur mit Trycatch bei.
    2. nein, die FileSuche ist entweder TopLevel oder AllDirectories - eine bestimmte Tiefe kannst du nicht angeben - da müsstest du eine eigene Suche proggen.

    Rasalas schrieb:

    schreibgeschützt
    Wenn Du keine Schreibrechte hast, hast Du keine. Wenn Try / Catch, dann fang genau die Art von Exception ab, die da auftritt (ExcessViolation oder so).
    Probier jedoch mal, die Attribute abzufragen:

    VB.NET-Quellcode

    1. Dim di = New IO.DirectoryInfo("c:\$Recycle.Bin\S-1-5-20")
    2. MessageBox.Show(di.Attributes.ToString)
    Wenn da das Attribut System auftaucht, geht es nicht:

    Und dann noch dies:

    VB.NET-Quellcode

    1. Dim path = "x:\\aa\b\\c/d//e/f"
    2. Dim file = path & ".txt"
    3. Dim di = New IO.DirectoryInfo(path)
    4. Dim fi = New IO.FileInfo(file)
    5. MessageBox.Show(di.FullName & Environment.NewLine & fi.FullName)
    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!

    ErfinderDesRades schrieb:

    es empfiehlt sich, versteckte Ordner erst garnet anzuzeigen im Treeview

    Schön und gut, aber dann wird der TE sein Ziel nie erreichen :D .
    Er möchte ja in die Userverzeichnisse und die kommen mit DirectoryInfo und FileInfo nicht wirklich gut.

    Ich habe mich mal drangesetzt und angefangen, so ein Teil zu programmieren, vielleicht braucht man es ja mal..
    Ist aber noch nicht fertig.



    LG,
    Bruno
    falls Dylab sich nicht meldet, guck auch mal Einfacher Explorer-TreeView

    Aber mit wenig Progger-Kenntnissen ist immer schlecht.
    Hast du denn wenigstens die Visual Studio - Empfohlene Einstellungen ?

    Weil sonst kannst du ganz wesentliche Grundlagen der Programmierung gar nicht erst erlernen.