DragDrop Filter (Pdf) anwenden.

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    DragDrop Filter (Pdf) anwenden.

    Hallo und guten Abend,

    ich benötige eure Hilfe. Ich habe folgenden DragDrop Code um einen Ordner zu befühlen. Nun möchte ich nur die Ablage von PDF Dateien ermöglichen, kann mir jemand weiter helfen. Beim openfile Dialog bekomme ich es hin, aber beim DragDrop leider nicht :(

    VB.NET-Quellcode

    1. Private Sub FilesLB_DragEnter(sender As Object, e As DragEventArgs) Handles FilesLB.DragEnter
    2. If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy
    3. End Sub


    VB.NET-Quellcode

    1. Private Sub FilesLB_DragDrop(sender As Object, e As DragEventArgs) Handles FilesLB.DragDrop
    2. For Each path In CType(e.Data.GetData(DataFormats.FileDrop, False), Array)
    3. FilesLB.Items.Add(path)
    4. Next
    5. End Sub


    Gruß
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

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

    Hi
    hast du die AllowDrop-Eigenschaft auf dem Steuerelement auf True gesetzt?
    Frage, wenn GetDataPresent(DataFormats.FileDrop) True ergibt, ab, ob das von FileDrop zurückgegebene String-Array tatsächlich nur PDFs enthält und gib bei DragEnter oder ggf. besser DragOver dann entsprechend e.Effect = DragDropEffects.Link oder dergleichen zurück.

    Bei DragDrop kannst du es ja dann analog zum präsentierten Code verarbeiten.

    Viele Grüße
    ~blaze~
    Hallo blaze,

    das ablegen von Dateien über DragDrop funktioniert tadellos, die AllowDrop ist auf True gesetzt.
    ​Frage, wenn GetDataPresent(DataFormats.FileDrop) True ergibt, ab, ob das von FileDrop zurückgegebene String-Array tatsächlich nur PDFs enthält und gib bei DragEnter oder ggf. besser DragOver dann entsprechend e.Effect = DragDropEffects.Link oder dergleichen zurück.

    Das verstehe ich leider nicht =O , was meinst du damit?
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Im DragOver- oder DragEnter-Event:

    VB.NET-Quellcode

    1. If Not e.Data.GetDataPresent(DataFormats.FileDrop) Then ' Handelt es sich bei diesem Vorgang um Drag&Drop einer Datei?
    2. e.Effect = DragDropEffects.None 'Falls nicht, können die Daten nicht verarbeitet werden
    3. Return
    4. End If
    5. 'Sonst überprüfe, ob es mindestens eine Datei gibt, die die Dateierweiterung .pdf hat
    6. For Each file As String In DirectCast(e.Data.GetData(DataFormats.FileDrop, False), IEnumerable(Of String))
    7. If System.IO.Path.GetExtension(file).Equals(".pdf", StringComparison.OrdinalIgnoreCulture) Then 'Ignoriere Groß-und-Kleinschreibung
    8. e.Effect = DragDropEffects.Link
    9. Exit For
    10. End If
    11. Next


    Im Drop gehst du analog vor: Statt e.Effect in der For-Schleife auf Link zu setzen und die Schleife zu verlassen, verarbeitest du die Pdf-Datei. Wenn du mit Linq firm bist, dann kannst du auch Where, bzw. All benutzen, um jene Dateien herauszufiltern, die Pdfs sind oder zu überprüfen, ob es sich um Pdfs handelt.

    Viele Grüße
    ~blaze~

    knuepel schrieb:

    VB.NET-Quellcode

    1. FilesLB.Items.Add(path)
    Ich würde um diese Zeile ein If machen, mit dem die Extension getestet wird, das ist verständlicher als eine LINQ-ösung:

    VB.NET-Quellcode

    1. If path.ToLower().EndsWith(".pdf") Then
    2. FilesLB.Items.Add(path)
    3. End If

    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!
    Jou. Der hier lässt auch Verzeichnisse durch:

    ~blaze~ schrieb:

    VB.NET-Quellcode

    1. If Not e.Data.GetDataPresent(DataFormats.FileDrop) Then
    Also dieser hier:

    VB.NET-Quellcode

    1. For Each path In files
    2. Dim info = New IO.FileInfo(path)
    3. If (info.Attributes And IO.FileAttributes.Directory) = 0 Then
    4. If path.ToLower().EndsWith(".pdf") Then
    5. ListBox1.Items.Add(path)
    6. End If
    7. End If
    8. Next
    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!
    erstmal Danke für eure Hilfe und Erklärungen. Wenn ich es richtig Verstanden habe, müsste es so doch gehen oder?.

    VB.NET-Quellcode

    1. Private Sub FilesLB_DragEnter(sender As Object, e As DragEventArgs) Handles FilesLB.DragEnter
    2. If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy
    3. End Sub


    VB.NET-Quellcode

    1. Private Sub FilesLB_DragDrop(sender As Object, e As DragEventArgs) Handles FilesLB.DragDropFor Each path In Files
    2. Dim info = New IO.FileInfo(path)
    3. If (info.Attributes And IO.FileAttributes.Directory) = 0 Then
    4. If path.ToLower().EndsWith(".pdf") Then
    5. FilesLB.Items.Add(path)
    6. End If
    7. End If
    8. Next
    9. End Sub

    Es wird dieser Fehler angezeigt: Fehler 1 "Files" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden. C:\User\Kopierprogramm\Kopierprogramm\MainFrm.vb 11 26 Kopierprogramm

    Leider auch ohne Erfolg :)

    VB.NET-Quellcode

    1. Private Sub FilesLB_DragEnter(sender As Object, e As DragEventArgs) Handles FilesLB.DragEnter
    2. If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy
    3. If Not e.Data.GetDataPresent(DataFormats.FileDrop) Then
    4. e.Effect = DragDropEffects.None
    5. Return
    6. End If
    7. End Sub

    VB.NET-Quellcode

    1. Private Sub FilesLB_DragDrop(sender As Object, e As DragEventArgs) Handles FilesLB.DragDrop
    2. For Each file As String In DirectCast(e.Data.GetData(DataFormats.FileDrop, False), IEnumerable(Of String))
    3. If System.IO.Path.GetExtension(file).Equals("*.pdf") Then
    4. e.Effect = DragDropEffects.Link
    5. Exit For
    6. End If
    7. Next
    8. End Sub


    Ist es vielleicht Einfacher ab den Next Funktion auf PDF Dateien zu Filtern?. Alle PDF Dateien werden weiter verarbeitet andre Dateien eben nicht.

    VB.NET-Quellcode

    1. Private Async Sub NextBtn_Click(sender As Object, e As EventArgs) Handles NextBtn.Click
    2. If FilesLB.Items.Count = 0 Then
    3. MessageBox.Show("Fügen Sie Dateien hinzu", "Keine Dateien vorhanden", MessageBoxButtons.OK, MessageBoxIcon.Information)
    4. Else
    5. Await MoveFiles()
    6. MessageBox.Show("Die Datei wurde erfolgreich in " & CType(PathsCB.SelectedValue, CustomFile).FileName & " abgelegt", "Erfolgreich", MessageBoxButtons.OK, MessageBoxIcon.Information)
    7. TabsTC.SelectedIndex = 1
    8. End If
    9. End Sub


    so wird die Datei weiter verarbeitet

    VB.NET-Quellcode

    1. Public Async Function MoveFiles() As Task
    2. If Directory.Exists(CType(PathsCB.SelectedValue, CustomFile).Path) Then
    3. For i = 0 To FilesLB.Items.Count - 1
    4. Dim p As String = Path.Combine(CType(PathsCB.SelectedValue, CustomFile).Path, Path.GetFileName(FilesLB.Items(i).ToString))
    5. If Not File.Exists(p) Then File.Move(FilesLB.Items(i).ToString, p)
    6. MovePB.Value = CInt(((i + 1) / FilesLB.Items.Count) * 100)
    7. Await Task.Delay(1)
    8. Next
    9. Else
    10. MessageBox.Show("Pfad existiert nicht", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    11. End If
    12. End Function


    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „knuepel“ ()

    knuepel schrieb:

    Es wird dieser Fehler angezeigt: Fehler 1 "Files" wurde nicht deklariert
    Sorry, vergessen. :whistling:
    Das sind die D&D-Dateien nach String() gecastet:

    VB.NET-Quellcode

    1. Dim files() = DirectCast(e.Data.GetData(DataFormats.FileDrop, False), 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!
    Danke es Funktioniert, nun noch zum Verständnis eine Farge: würde es mit der cType Funkion auch funktionieren, oder bringe ich da was durcheinander?
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Wenn du bereits weißt, dass ein Objekte einen bestimmten Typ hat, so solltest du DirectCast verwenden.
    Sagen wir z.B. du erhältst in einem Event-Handler, wie bei einem Abonnenten von Button.Click, den sender-Parameter. Dieser ist als Object deklariert und du weißt aber, dass der sender ein Button ist, da du ja Button.Click abonniert hast. Dann würdest du DirectCast verwenden:

    VB.NET-Quellcode

    1. Dim x = DirectCast(sender, Button)

    Im Gegensatz dazu gibt es wiederum Typen, die eine explizite Konvertierung benötigen (mir fällt jetzt leider kein gutes Beispiel ein, bei dem es so wäre und nicht anders gelöst würde). Es geht im Prinzip darum, ein Objekt von einem Typ in einen anderen zu konvertieren. Sagen dir explizite und implizite Konvertierung was?

    Verwirrungsstiftung

    Ach ja, es gibt auch noch TryCast und TypeOf ... Is ...:
    TypeOf ... Is ... wird dazu verwendet, um zu überprüfen, ob ein bestimmtes Objekt eine Instanz von einem bestimmten Typ ist:

    VB.NET-Quellcode

    1. If TypeOf sender Is Button Then

    Es gilt zu beachten, dass auch von Button erbende Klassen erkannt werden. So geht bspw.

    VB.NET-Quellcode

    1. If TypeOf sender Is Control

    für Labels, Buttons, Forms und alle anderen Control-Erben.
    Wenn du erst überprüfen willst und es danach weiterverwenden willst, ist TryCast perfekt dafür geeignet. Es versucht, das Objekt zu casten, wenn das fehlschlägt, gibt es Nothing zurück, sonst das zu castende Objekt.

    VB.NET-Quellcode

    1. Dim x As Button = TryCast(sender, Button)
    2. If x Is Nothing Then 'Entweder sender war Nothing oder kein Button

    Ich glaube außerdem, dass das auch in VB.Net geht: Wenn du Wertetypen, wie Integer, usw. casten möchtest, geht das nicht ohne Probleme. Wertetypen können nicht Nothing sein. So wird es fehlschlagen, wenn du

    VB.NET-Quellcode

    1. Dim x As Object = 123
    2. Dim y As Integer = TryCast(x, Integer)

    versuchst. Was dem Abhilfe verschaffen kann, ist Nullable(Of T). Wenn du einen Wertetypen mit einem ? hinter dem Typen T definierst, erhälst du ein Nullable(Of T). Ich denke, dass das auch in VB.Net geht (ich verwende nur C# und hab's nie ausprobiert):

    VB.NET-Quellcode

    1. Dim x As Object = 123
    2. Dim y As Integer? = TryCast(x, Integer?)

    Wenn die Konvertierung fehlschlägt, nimmt y einen Spezialwert an, der so tut, als ob er Nothing wäre.
    Für Generika gibt's so eine Lösung afaik nicht und ich denke mal, dass sich VB.Net und C# nicht unterscheiden.


    Viele Grüße
    ~blaze~
    ich bin total begeistert, Perfekt !!!!
    Hier wird mir nicht nur geholfen sondern auch noch super gute Erklärung geliefert, Danke für eure Mühe :thumbsup:
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    knuepel schrieb:

    würde es mit der cType Funkion auch funktionieren
    In C# hab ich folgendes festgestellt:

    C#-Quellcode

    1. Button btn1 = sender as Button;
    2. Button btn2 = (Button)sender;
    Wenn der Cast nicht funktioniert, also wenn sender nicht vom Typ Button ist, kommt in der 1. Zeile null raus, in der zweiten Zeile kommt eine InvalidCastException.
    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!

    knuepel schrieb:

    würde es mit der cType Funkion auch funktionieren, oder bringe ich da was durcheinander?
    würde auch funktionieren, weil CType immer funktioniert, wo DirectCast geht.
    aber CType ist eiglich für was anneres gedacht, nämlich fürs Aufrufen ausdrücklicher Umwandlungs-Funktionen, wenn sie in den betroffenen Klassen vorhanden sind.