Dateipfad im FormDrag Event auslesen

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    Dateipfad im FormDrag Event auslesen

    Hallöchen
    Ich möchte mein Programm um eine Funktion erweitern, mit der ich Rechnungen auf die Form ziehen kann um diese, nach Auswahl der zugehörigen Firma, in einem entsprechende Ordner abzulegen.
    Hierzu möchte ich zunächst im DragDrop Event der Form den Dateipfad der gedroppten Datei auslesen.
    Hierzu habe ich einen Code gefunden, der aber leider nur OptionStrict Off funktioniert. Ihn umzuwandeln bekomme ich nicht hin:

    VB.NET-Quellcode

    1. Private Sub Form1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
    2. Dim files() As String = e.Data.GetData(DataFormats.FileDrop) 'keine implizierte Konvertierung von Object in string()
    3. 'Dim files() As String = e.Data.GetData(DataFormats.FileDrop).tostring / funktioniert nicht
    4. For Each path In files
    5. MsgBox(path)
    6. Next
    7. End Sub


    Wie mache ich hieraus etwas, das mit Option Strict On funktioniert?
    @DerSmurf Klar, dass das nicht geht, ToString() macht ein String, nicht aber ein String-Array.
    Probierma

    VB.NET-Quellcode

    1. CType(..., String())

    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!

    VB.NET-Quellcode

    1. Dim files() As String = CType(e.Data.GetData(DataFormats.FileDrop), String())

    funktioniert! Ich danke dir!

    Hmm.
    Ist es überhaupt richtig, das ganze als string auszulesen?
    Ich bekomme ja ein Problem beim kopieren. Testweise will ich die gedraggte Datei einfach in den Programmordner kopieren.
    Aber ​FileCopy verlangt ja eine Destination FIle. Ich habe ja nur ein Destination Folder, weil ich nicht weiß welche Datei gedraggt wird :(

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

    @DerSmurf Du bekommst dort einen Sourcefile. Den Destinationfile musst Du selbst bereitstellen.
    Per Deklaration ist das ein Object, was dahintersteckt, findest Du raus:
    Setz nen Haltepunkt drauf und sieh Dir per MouseHOver an, was da für ein Type dahinter steckt.


    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!
    Genau das ist ja meine Frage.
    Sagen wir ich will die Datei "123.txt" kopieren. Das wäre dann:

    VB.NET-Quellcode

    1. ​Filecopy("Desktoppfad\123.txt", Application.StartupPath & "\123.txt"

    Ich muss also vor dem kopieren den Dateinamen mit Endung auslesen.
    Das gestaltet sich ja aus einem String, sehr viel schwieriger (splitten am letzten "\" denke ich), also mit einer "FileInfo".
    Dann habe ich ja so sachen wie .getfilename und gedöns.

    Aber kann ich oben gepostetes in eine FileInfo verwandeln, oder bin ich hier irgendwie total auf dem Holzweg?
    Ah. Mein Fehler war, dass ich versucht habe das String Array, welches durch den DragDrop erzeugt wird zu einer FileInfo zu machen.
    Aber ich muss ja natürlich nicht das Array, sondern jeden Eintrag des Arrays in ein FileInfo umwandeln.
    So sollte mein Code doch jetzt ansehnlich sein, oder?

    VB.NET-Quellcode

    1. Private Sub Form1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
    2. Dim FileInfo As FileInfo
    3. Dim files() As String = CType(e.Data.GetData(DataFormats.FileDrop), String())
    4. For Each path In files
    5. FileInfo = New FileInfo(path)
    6. FileCopy(path, Application.StartupPath & "\" & FileInfo.Name)
    7. Next
    8. End Sub


    Edit: natürlich noch Imports System.IO eingefügt. Aber versteht sich ja von selbst.

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

    Hmm. Da gibts doch noch eine Sache.
    Nachdem ich den DragDrop Code aus meinem DemoProjekt (mit aktiviertem VisualBasic Namespace) in mein Hauptprogramm (mit deaktiviertem VisualBasic Namespace) kopiert habe, habe ich festgestellt, dass FileCopy eben zu diesem NameSpace gehört.
    ​Microsoft.VisualBasic.FileCopy(path, Application.StartupPath & "\" & FileInfo.Name)
    Das sieht ja nun wirklich nicht schön aus, und den Namespace will ich ja (Sofern möglich) aus meinem Programm verbannen.
    Es gibt hier im Forum eine wunderbare Übersichtsseite über bösen VSB Code und die guten Alternativen. Diesen kann ich nicht finden.
    Auch liefert mir Google irgendwie nichts brauchbares.
    Ja, das ist doch Premium.
    Nun habe ich aber bereits das nächste Problemchen.
    Nachdem eine Datei auf die Form gezogen wurde, soll der User auswählen können, um welche Art Daten es sich handelt (Rechnung, Bestellung, Preisliste, etc)
    Hierfür lasse ich nach erfolgreichem "Drop" eine Form anzeigen, die einfach nur Buttons enthält, um eben dieses auszuwählen.
    Nun muss ich ja aber an meine Aufruf Sub übergeben, was in der sich öffnenden Form ausgewählt wurde.
    Das habe ich bisher nur umgedreht über Properties gemacht. Also "Aufruf Form" übergibt Daten an aufgerufene Form.
    Andersrum geht es doch bestimmt auch ohne Properties, weil ich die Daten ja nur in der aufrufenden Sub benötige.
    Wie stelle ich das denn am geschicktesten an?
    Stell eine Public Property in Deinem Subform bereit, die dann Button-Click-abhängig befüllt wird und die das Aufrufform auswertet:

    VB.NET-Quellcode

    1. Using DlgFileChooser As New FrmFileChooser
    2. DlgFileChooser.ShowDialog(Me)
    3. If DlgFileChooser.FileType = 0 Then ProcessInvoice()
    4. If DlgFileChooser.FileType = 1 Then ProcessDeliveryNote()
    5. End Using


    noch schöner mit nem FileType-Enum:

    VB.NET-Quellcode

    1. Enum FileType
    2. Invoice
    3. DeliveryNote
    4. '...
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    huhu. hmm damit tue ich mich schwer. Mein Ansatz ist glaube ich sehrt kläglich - sowohl mit Enums, als auch mit Propertys tue ich mich schwer.

    Code der SubForm:

    VB.NET-Quellcode

    1. Public Class frmChooseFileType
    2. Enum FileType
    3. Delivery = 0
    4. Invoice = 1
    5. End Enum
    6. Private _FileType As FileType
    7. Public Property PropFileType() As FileType
    8. Get
    9. FileType = _FileType 'frmChooseFileType.FileType ist ein Enumerationstyp und kann nicht als Ausdruck verwendet werden
    10. End Get
    11. Set(value As FileType)
    12. _FileType = value
    13. End Set
    14. End Property
    15. Private Sub btnInvoice_Click(sender As Object, e As EventArgs) Handles btnInvoice.Click
    16. _FileType = FileType.Invoice
    17. End Sub
    18. End Class


    und die Hauptform:

    VB.NET-Quellcode

    1. Private Sub frmMainForm_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
    2. Using ChooseFileType As New frmChooseFileType
    3. ChooseFileType.ShowDialog(Me)
    4. If ChooseFileType._FileType = 1 Then MessageBox.Show("Rechnung")
    5. If ChooseFileType._FileType = 0 Then MessageBox.Show("Bestellung")
    6. End Using
    7. End Sub


    Ich habe gerade nochmal versucht den Sinn eines Enums zu verstehen, aber ich bekomme nicht in meinen Schädel, wo der Unterschied zwischen Enum und der Speicherung von z.B. 0 für Rechnung, 1 für Bestellung, in einer Property ist.

    DerSmurf schrieb:

    VB.NET-Quellcode

    1. FileType = _FileType 'frmChooseFileType.FileType ist ein Enumerationstyp und kann nicht als Ausdruck verwendet werden
    Machst Du einfach

    VB.NET-Quellcode

    1. Return _FileType
    Eleganter wäre gleich

    VB.NET-Quellcode

    1. Public Class frmChooseFileType
    2. Enum FileType
    3. Delivery = 0
    4. Invoice = 1
    5. End Enum
    6. Public Property PropFileType() As FileType ' das allein genügt hier
    7. Private Sub btnInvoice_Click(sender As Object, e As EventArgs) Handles btnInvoice.Click
    8. FileType = FileType.Invoice
    9. End Sub
    10. End Class

    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!
    und in der Hauptform? (sorry, hab ich eben vergessen)

    VB.NET-Quellcode

    1. Private Sub frmMainForm_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
    2. Using ChooseFileType As New frmChooseFileType
    3. ChooseFileType.ShowDialog(Me)
    4. If ChooseFileType._FileType = 1 Then MessageBox.Show("Rechnung") 'ChooseFileType._FileType ist Private und nicht zugreifbar
    5. If ChooseFileType._FileType = 0 Then MessageBox.Show("Bestellung")
    6. End Using
    7. End Sub
    @DerSmurf Da musst Du die Property, nicht aber das Member verwenden, mach den Unterstrich weg.
    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!
    Wenn ich die Property verwende, muss ichs ja in PropFileType umbenennen. Das klappt!
    Muss das so aussehen?

    VB.NET-Quellcode

    1. Public Class frmChooseFileType
    2. Enum FileType
    3. Order = 0
    4. Invoice = 1
    5. End Enum
    6. Public Property PropFileType() As FileType
    7. Private Sub btnInvoice_Click(sender As Object, e As EventArgs) Handles btnInvoice.Click
    8. PropFileType = FileType.Invoice
    9. Me.Close()
    10. End Sub
    11. Private Sub btnOrder_Click(sender As Object, e As EventArgs) Handles btnOrder.Click
    12. PropFileType = FileType.Order
    13. Me.Close()
    14. End Sub
    15. End Class


    VB.NET-Quellcode

    1. Private Sub frmMainForm_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
    2. Using ChooseFileType As New frmChooseFileType
    3. ChooseFileType.ShowDialog(Me)
    4. If ChooseFileType.PropFileType = 1 Then MessageBox.Show("Rechnung")
    5. If ChooseFileType.PropFileType = 0 Then MessageBox.Show("Bestellung")
    6. End Using
    7. End Sub


    DerSmurf schrieb:

    Ich habe gerade nochmal versucht den Sinn eines Enums zu verstehen, aber ich bekomme nicht in meinen Schädel, wo der Unterschied zwischen Enum und der Speicherung von z.B. 0 für Rechnung, 1 für Bestellung, in einer Property ist.

    DerSmurf schrieb:

    aber ich bekomme nicht in meinen Schädel, wo der Unterschied zwischen Enum und der Speicherung von z.B. 0 für Rechnung, 1 für Bestellung, in einer Property ist.
    Vor allem mal im Verständnis/Lesbarkeit. Wenn Du FileType = 1 stehen hast, müsstest Du, wenn Du in 3 Monaten mal wieder drüberschaust, erstmal tief im Code nachsehen/suchen, was 1 bedeutet. Wenn da stattdessen steht: FileType = FileType.Invoice, dann ist das Verständnis sofort da.

    VB.NET-Quellcode

    1. If ChooseFileType.PropFileType = frmChooseFileType.FileType.Invoice Then MessageBox.Show("Rechnung")
    2. If ChooseFileType.PropFileType = frmChooseFileType.FileType.Order Then MessageBox.Show("Bestellung")

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Vor allem mal im Verständnis/Lesbarkeit. Wenn Du FileType = 1 stehen hast, müsstest Du, wenn Du in 3 Monaten mal wieder drüberschaust, erstmal tief im Code nachsehen/suchen, was 1 bedeutet.

    verstanden!