Dateipfad auslesen (Dropdownelement)

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von almheidy.

    Dateipfad auslesen (Dropdownelement)

    Guten Morgen Community,

    ich hab eine Dropdownliste welche alle "Daten" in einem Ordner ausliest, und die dann in die Liste läd. Wenn der Nutzer dann eine Datei auswählt soll eig der Dateipfad hinterlegt werden, aber ich bekomme dann immer nur den Dateipfad zum Debug hin also:

    C:\User....\....\...\bin\Debug\Test

    und nicht den Pfad an welchem die Datei hinterlegt ist

    C:\User\Desktop\OrdnerXYZ

    hier mal der Code:

    Spoiler anzeigen


    VB.NET-Quellcode

    1. For Each File In My.Computer.FileSystem.GetFiles("c:\Users\Desktop\Projekte")Dim Namensgebungfuerdentest As String = IO.Path.GetFileNameWithoutExtension(My.Computer.FileSystem.GetName(File))
    2. cbVb.Items.Add(Namensgebungfuerdentest)
    3. Next




    Jemand Ideen oder Anregungen ?(
    In deinem Startpost steht "alle Daten aus einem Ordner ausliest"
    Meinst Du Dateien oder Daten? Weil Ordner könnte man auch als potenzielle Daten sehen.



    Nutze niemals den My. Namespace, außer wenn Du auf Ressourcen zugreifst.

    Es gibt dafür fast immer Klassen.


    In deinem Fall benötigst Du die IO Klasse.

    Also:

    VB.NET-Quellcode

    1. Imports System.IO





    VB.NET-Quellcode

    1. Private Sub ReadFiless()
    2. Dim Pat As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
    3. For Each p As String In Directory.GetFiles(Pat)
    4. Dim I As New FileInfo(p)
    5. ComboBox1.Items.Add(I.FullName)
    6. Next
    7. End Sub


    Pfadverknüpfung mit Path.Combine.

    VB.NET-Quellcode

    1. Dim Patt As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "test")

    So wärst Du im Ordner "test" auf dem Desktop.

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

    Also ich hab mir mal fix eine neue Datei angelegt und geschaut wie sich die Combobox füllt, leider keine "Ergebnisse"

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class TesterPrivate Sub Tester_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim Patt As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Projekte")For Each p As String In Directory.GetFiles(Patt)Dim I As New FileInfo(p)
    4. ComboBox1.Items.Add(I.Name)
    5. NextEnd Sub
    6. End Class



    Aber kann gut sein das ich mich wieder falsch Ausgedrückt habe, ich versuch es nochmal:
    In dem Ordner Test bzw. Projekte liegen Excel-Datein, die würde ich gerne in der Combobox ausführen (ohne Pfadnamen etc. -> in meinem Code versucht)
    Jetzt soll der User aus dem Dropdown eine Liste auswählen, und davon brauch ich dann den Dateipfad, da ich diese Excel liste dann Öffnen möchte ^^

    Aber bis da hin schon mal danke an euch beide!



    Ps.: nicht ausführen sondern aufführen, aber liest sich lustig deswegen lass ich das mal :whistling:

    almheidy schrieb:

    leider keine "Ergebnisse"


    Was meinst du damit?

    Habe ich dich richtig verstanden? Du willst in der ComboBox nur die Dateinamen anzeigen, aber wenn der User einen Namen davon auswählt, brauchst du den vollen Pfad davon, um die Datei öffnen zu können?

    Wenn ja, dann leg dir eine List (Of String) zu, die du parallel zu ComboBox mit Einträgen (aber dann .FullName oder so) füllst. Wenn du den .SelectedIndex deiner Combobox abfragst, kannst du mit dem gleichen Index den Eintrag aus der List holen (den Pfad dazu).
    @ sonne75

    Genau so meine ich das, also würde ich optimal mit einem Array arbeiten ? welches den vollen Dateipfad + Namen hat... ich versuch mich mal an der Variante



    @ Kevin Hombre

    Der OpenFileDialog wäre eine alternative, aber dann ist die vermeidlich "schönere" Version mit dem Dropdown nicht mehr so schön realisierbar, aber wenn ich das mit den Arrays nicht gebacken bekomme werde ich wohl auf deine "Version" zurück greifen.



    Schön Dank für die Anregungen :thumbup:

    VB.NET-Quellcode

    1. Dim sFullName As String = "c:\programme\myapp.exe"
    2. ' Pfad extrahieren
    3. Dim sPath As String = IO.Path.GetDirectoryName(sFullName)
    4. ' Dateiname extrahieren
    5. Dim sFile As String = IO.Path.GetFileName(sFullName)
    6. ' Dateierweiterung extrahieren
    7. Dim sExt As String = IO.Path.GetExtension(sFullName)
    @ TVX

    Teile aus dem Code hab ich mir schon zusammen geklaut gehabt :whistling: .

    Aber Leider bringt mich das bei dem Problem nicht weiter, versuch mal den 1. Code, in dem Dropdownelement steht dann nur der Name der Excelliste also zb.: "Audi" "BMW" etc.

    Aber wenn die ausgewählt werden gibt er mir mit

    VB.NET-Quellcode

    1. Dim sPath As String = IO.Path.GetDirectoryName(sFullName)


    nicht den Richtigen Pfad wieder sondern:



    Obwohl sie halt auf dem Desktop liegen
    @ sonne75

    Ja dann zeigt er mir den komplette Pfadnamen an, aber in der Combobox soll dann ja nur "Audi" stehen, und der Ordnerpfad in einer Variablen weitergegeben werden.

    Bin grade noch am probieren, aber ich denke ich komm um die List sache nicht drumherum, auch wen ich nicht weiß wie ich damit arbeite.
    Stimmt, ich hab I.Name und I.FullName vertauscht, kein Wunder.

    Und was ist bei dir MyList? Ist das eine erstellte Liste ausserhalb der Form oder ist das etwas deklariertes? Also wie Dim MyList as String? :S

    Sorry, heute ist irgendwie nicht mein Tag.

    Wenn nicht erstell ich einfach eine Liste die ich dann mit Visibl = False ausblende, aber das ist sicher nicht so "sauber" oder?
    Das was ihr versucht ist Müll!
    Es heißt: ComboBox.Items.Add(object). Was bedeutet, dass ihr dort alles mögliche reinfeuern könnt - abgesehen davon, dass es nicht dafür vorgesehen ist.
    Wenn du dir eine Klasse schreibst - ComboBoxElement und darin die Eigenschaft Property Path As String einbaust sowie ToString() As String überschreibst,
    kannst du via DirectCast(ComboBox.SelectedItem, ComboBoxElement) wieder auf die Eigenschaft Path zugreifen.
    Somit hast du dein Ziel mit nur einer einzigen Klasse erreicht, die du auch noch der ComboBox einfügen kannst, da diese solche Aktionen erlaubt.
    Mag sein, dass es auf den ersten Blick "einfacher" erscheint, allerdings kommen dann die Probleme, wenn man anfängt, die ComboBox zu sortieren, Items zu löschen etc, da beide Listen synchron sein müssen.
    Außerdem ist die Lösung mit einer Klasse ressourcenschonender und kann beliebig erweitert werden, da sie nicht auf eine List(Of String) gebunden ist.

    Oder ist das

    VB.NET-Quellcode

    1. Public Class ComboBoxElement
    2. Public Property Path As String
    3. Public Sub New(path As String)
    4. Me.Path = path
    5. End Sub
    6. Public Override Function ToString() As String
    7. Return System.IO.Path.GetFileNameWithoutExtension(Me.Path)
    8. End Function
    9. End Class

    schlechter, als eine Liste zu betreuen, die zudem nicht mit der ComboBox synchron ist?

    Für Neueinsteiger mag das sicher erschlagend wirken, aber man lernt nur dadurch dazu, indem man sich weiterbildet - und eine List(Of String) für ComboBoxen zu verwenden gehört mMn nicht dazu.
    @ AliveDevil

    Dein Code kommt also an den Anfang von meinem Programm? Und dann greif ich path ab ?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class ComboBoxElement
    2. Public Property Path As StringPublic Sub New(ByVal path As String)
    3. Me.Path = path
    4. End SubPublic Override Function ToString() As String <----- "end of" Anweisung erwartet
    5. Return System.IO.Path.GetFileNameWithoutExtension(Me.Path) <---- kann nicht ausserhalb einer Method
    6. End Function <---- End Function muss ein entsprechendes "Function" voranstehen
    7. End Class


    Ps.: Erschlagen war das richtige Wort...
    Warum ist dein Code so komisch formatiert? Und warum stehen da Kommentare mit Fehlermeldungen (Function usw?)?

    Würdest du den Code richtig formatieren (Sub und Function fangen in der neuen Zeile an), dann gäbe es doch keine Fehler... :?: