ToolStripDropDown

  • VB.NET

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

    ToolStripDropDown

    Hallöchen,

    ich habe folgende Frage. Um ein ToolStripDropDown so zu nutzen, dass ich alle Dateien eines Verzeichnis aufliste (am Besten nur die Bezeichnung, nicht den ganzen Pfad) und gleichzeitig durch anklicken ausführe, wie kann ich das bewerkstelligen?

    Nun hab ich eben in diesen Thread von @ErfinderDesRades gelesen, dass es so wie unten nicht der optimale weg ist.
    Sowas wie DisplayMember oder DataSource kann ich aber beim ToolStripDropDown nicht finden. Wie muss ich es da angehen?

    VB.NET-Quellcode

    1. Dim path As String = "\\rs-win1\ablage\ISO\Formulare\1_Allgemein\3_Hinweislisten"
    2. For Each File As String In Directory.GetFiles(path)
    3. Me.TSDD_Hinweislisten.DropDownItems.Add(File)
    4. Next
    @Sam85,

    willst du mit einem DropdownButton oder einer Combobox arbeiten?

    Der Thread von @ErfinderDesRades bezieht sich auf File-Listboxen.

    Du kannst es jedoch trzd über die

    VB.NET-Quellcode

    1. //Declariere ein Array
    2. Private _Files As FileInfo()
    3. //Deklariere ein DirectoryInfo für dein Directory
    4. Dim di = New DirectoryInfo(/*Dein Pfad*/)
    5. //Weise dem Array den Rückgabewert von .GetFiles() zu
    6. _Files = di.GetFiles("*.*", SearchOption.AllDirectories)



    nun kannst du das ganze einfach per toolStripComboBox1.Items.AddRange(_Files) zuweisen.



    Lg
    Brain is Loading: 35%
    @mausekeks

    danke für die Rückmeldung, ich will ein ToolStripDropDownButton keine ToolStripComboBox nutzen.
    Hab das versucht das umzusetzen, nur gibt es kein .Items.AddRange() nur .DropDownItems.AddRange() bzw. .DropDown.Items.AddRange()
    Jedoch kann FileInfo() nicht in die ToolStripItemCollection konvertiert werden. ?(

    VB.NET-Quellcode

    1. Private _Files As FileInfo()
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim path As String = "\\rs-win1\ablage\ISO\Formulare\1_Allgemein\3_Hinweislisten"
    4. Dim di = New DirectoryInfo(path)
    5. _Files = di.GetFiles("*.*", SearchOption.AllDirectories)
    6. TSDD_Hinweislisten.DropDownItems.AddRange(_Files)
    7. End Sub

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Sam85“ ()

    Mein Beispiel war für eine ToolStripComboBox,

    du müsstest für jedes Programm in deinem Directory ein eigenes ToolStripDropDownItem erstellen.

    Das positive daran ist das diese DropDownItems eigene Click-Events haben wodurch es sich für dich erleichtert deine Programme dadurch zu starten.

    hier mal ein paar links:

    stackoverflow.com/questions/13…w-to-use-correctly-vb-net

    msdn.microsoft.com/de-de/libra…opdownitem(v=vs.110).aspx

    Das sollte dir helfen die Klasse DropDownItems zu verstehen.



    Wenn noch etwas unklar ist dann einfach nochmal fragen :D, dann hab ich auch mehr Zeit als jetzt.

    Lg
    Brain is Loading: 35%
    @mausekeks

    Ich bewege mich sicherlich schon auf dem Holzweg, wollte es aber wenigstens probieren:

    Wenn ich das von StackOverFlow richtig verstanden habe, muss ich ja für jeden Eintrag im DropDown ein WithEvents anlegen und eins für den DropDown selbst?
    Kann ich die Einträge auch dynamisch erzeugen?

    VB.NET-Quellcode

    1. Dim strPathHints As String = "\\rs-win1\ablage\ISO\Formulare\1_Allgemein\3_Hinweislisten"
    2. Private _Files As FileInfo()
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim di As New DirectoryInfo(strPathHints)
    5. _Files = di.GetFiles("*.pdf", SearchOption.AllDirectories)
    6. For Each fi As FileInfo In _Files
    7. TSDD_Hinweislisten.DropDownItems.Add(System.IO.Path.GetFileNameWithoutExtension(fi.Name))
    8. Next fi
    9. End Sub


    VB.NET-Quellcode

    1. Private WithEvents tsi As New ToolStripMenuItem("TSDD_Hinweislisten")
    2. Private Sub RunToolStripDropDown(sender As Object, e As EventArgs) Handles tsi.Click
    3. Process.Start(strPathHints & "\" & tsi.Name & ".pdf")
    4. End Sub

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

    @Sam85 Was soll der Nonsens?
    Mit SearchOption.AllDirectories hast Du mal fix mehrere hundert Dateien aufgesammelt.
    Du solltest Deine Dateien besser auswählen.
    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!
    @RodFromGermany
    Es war beabsichtigt, von dem Pfad aus, in alle Unterverzeichnisse zu gehen. Lediglich die Extension werde ich dann noch anpassen, da gebe ich dir recht.
    War das der Nonsene oder der gesamte Aufbau?

    Sam85 schrieb:

    War das der Nonsene
    Ja, weil dann Ü100 Items gelistet werden.
    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!
    Du kannst dir ein Objekt der deiner Klasse erzeugen und diesem einen handler subscriber

    Im event dann den Sender abfragen und damit weiterarbeiten.

    Wie hier gezeigt:
    stackoverflow.com/questions/15…amically-add-event-handle

    sry das ich dir nur links geben kann momentan am Smartphone coded es sich bisschen schlecht


    lg
    Brain is Loading: 35%
    So nun hier vil. hilft dir das jetzt mehr, habe dir nun mal eben schnell ein Beispiel gemacht. (nicht zwangsläufig die beste Methode das zu lösen)

    1. Ich erstelle eine Klasse welche von ToolStripMenuItem erbt und implementiere das Property Path

    Klasse erstellen

    C#-Quellcode

    1. public class FileObject : ToolStripMenuItem
    2. {
    3. public string Path { get; set; }
    4. }



    2. In meinem Button.Click-Event erstelle ich dann eine neue Instanz der Klasse DirectoryInfo, ein FileInfo[]-Array und ein Objekt meiner Klasse FileObject.
    Mit der ​for()-Schleife iteriere ich durch das Array ​FileInfo[] und instanziiere damit mein FileObject. Das FileObject subscribed dann den EventHandler fileObj_Click und wird dem Übergeordneten Control hinzugefügt.

    Im EventHandler frägst du dann nur noch ab woher der Aufruf kam.

    Button.Click-Event und Eventhandler

    C#-Quellcode

    1. private void toolStripButton1_Click(object sender, EventArgs e)
    2. {
    3. //New Instance of DirectoryInfo
    4. DirectoryInfo inf = new DirectoryInfo(Directory.GetCurrentDirectory() + "\\program");
    5. //Array of FileInfo
    6. FileInfo[] info;
    7. //Get the DirectoryInfo
    8. info = inf.GetFiles("*.*", SearchOption.AllDirectories);
    9. //New declaration of FileObject
    10. FileObject fileObj = null;
    11. for (int i = 0; i< info.Length; i++)
    12. {
    13. fileObj = new FileObject();
    14. fileObj.Name = info[i].Name;
    15. fileObj.Text = info[i].Name;
    16. fileObj.Path = info[i].DirectoryName;
    17. toolStripDropDownButton1.DropDownItems.Add(fileObj);
    18. fileObj.Click += fileObj_Click;
    19. }
    20. }
    21. private void fileObj_Click(object sender, EventArgs e)
    22. {
    23. FileObject tmp = (FileObject)sender;
    24. Process.Start(tmp.Path + "\\" + tmp.Name);
    25. }




    So das ist zwar jetzt in C# sollte aber Easy sein das in VB nach zu bauen.
    Hoffe es macht das bisschen Klarer.

    Lg
    Brain is Loading: 35%

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

    @mausekeks
    Sorry, dass ich mich erst so spät wieder melde. Hab das nun versucht.
    Hoffe ich konnte das soweit korrekt in .NET nachstellen.
    Jedoch finde ich das nicht fileObj.Click += fileObj_Click nur fileObj.PerformClick()

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Public Class FileObject
    5. Inherits ToolStripMenuItem
    6. Public Property Path As String
    7. End Class
    8. Dim str As String = "\\rs-win1\ablage\ISO\Formulare\1_Allgemein\3_Hinweislisten"
    9. Private Sub fo_click(ByVal sender As Object, ByVal e As EventArgs)
    10. Dim tmp As FileObject = CType(sender, FileObject)
    11. Process.Start(tmp.Path & "\" & tmp.Name)
    12. End Sub
    13. Private Sub ToolStripDropDownButton1_Click(sender As Object, e As EventArgs) Handles ToolStripDropDownButton1.Click
    14. Dim di As DirectoryInfo = New DirectoryInfo(str)
    15. Dim fi As FileInfo()
    16. fi = di.GetFiles("*.pdf*", SearchOption.AllDirectories)
    17. Dim fo As FileObject = Nothing
    18. For i As Integer = 0 To fi.Length - 1
    19. fo = New FileObject()
    20. fo.Name = fi(i).Name
    21. fo.Text = fi(i).Name
    22. fo.Path = fi(i).DirectoryName
    23. ToolStripDropDownButton1.DropDownItems.Add(fo)
    24. fo.PerformClick()
    25. Next
    26. End Sub
    27. End Class


    EDIT: Hab mal ein Test angefügt.
    Dateien
    • Test.zip

      (94,73 kB, 50 mal heruntergeladen, zuletzt: )

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

    Sam85 schrieb:

    fileObj.Click += fileObj_Click
    ist C#.
    In VB.NET geht dfas mit

    VB.NET-Quellcode

    1. AddHandler fileObj.Click, AddressOf fileObj_Click
    ==============
    Und dann solltest Du Deine Pfade so legen, dass sie auch woanders laufen, z.B. auf C:\Temp.
    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!

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

    @RodFromGermany

    vielen Dank. Macht es mehr Sinn, das Laden der Inhalte für den ToolStripButton in der Form auszuführen? Weil aktuell wenn ich den Button betätige, verzögert bzw. hackt es ganz kurz.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Public Class FileObject
    5. Inherits ToolStripMenuItem
    6. Public Property Path As String
    7. End Class
    8. Dim str As String = "\\rs-win1\ablage\ISO\Formulare\1_Allgemein\3_Hinweislisten"
    9. Private Sub fo_click(ByVal sender As Object, ByVal e As EventArgs)
    10. Dim tmp As FileObject = CType(sender, FileObject)
    11. Process.Start(tmp.Path & "\" & tmp.Name)
    12. End Sub
    13. Private Sub ToolStripDropDownButton1_Click(sender As Object, e As EventArgs) Handles ToolStripDropDownButton1.Click
    14. Dim di As DirectoryInfo = New DirectoryInfo(str)
    15. Dim fi As FileInfo()
    16. fi = di.GetFiles("*.pdf*", SearchOption.AllDirectories)
    17. Dim fo As FileObject = Nothing
    18. ToolStripDropDownButton1.DropDownItems.Clear()
    19. For i As Integer = 0 To fi.Length - 1
    20. fo = New FileObject()
    21. fo.Name = fi(i).Name
    22. fo.Text = fi(i).Name
    23. fo.Path = fi(i).DirectoryName
    24. ToolStripDropDownButton1.DropDownItems.Add(fo)
    25. AddHandler fo.Click, AddressOf fo_click
    26. Next
    27. End Sub
    28. End Class



    EDIT: Natürlich, der Pfad war jetzt auf mein Bedürfnis bzw. meiner Kollegen angepasst.

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

    Sam85 schrieb:

    ganz kurz
    ist relativ.
    Was Du kannst, ist das Updaten des Controls für die Dauer des Addens zu verhindern:

    VB.NET-Quellcode

    1. Me.ToolStrip1.SuspendLayout()
    2. ' ... (For)
    3. ToolStripDropDownButton1.DropDownItems.Add(fo)
    4. ' ... (Next)
    5. Me.ToolStrip1.ResumeLayout(False)
    6. Me.ToolStrip1.PerformLayout()

    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!
    @RodFromGermany

    hmm hab ich versucht, hackt aber immer noch (wenn man das hacken nennen möchte, ist einfach nur eine minimale Verzögerung). Hab jetzt das DropDownOpening Event genommen, da läuft es sauber.
    Danke für eure Unterstützung. :)

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Public Class FileObject
    5. Inherits ToolStripMenuItem
    6. Public Property Path As String
    7. End Class
    8. Dim str As String = "\\rs-win1\ablage\ISO\Formulare\1_Allgemein\3_Hinweislisten"
    9. Private Sub fo_click(ByVal sender As Object, ByVal e As EventArgs)
    10. Dim tmp As FileObject = CType(sender, FileObject)
    11. Process.Start(tmp.Path & "\" & tmp.Name)
    12. End Sub
    13. Private Sub ToolStripDropDownButton1_DropDownOpening(sender As Object, e As EventArgs) Handles ToolStripDropDownButton1.DropDownOpening
    14. Dim di As DirectoryInfo = New DirectoryInfo(str)
    15. Dim fi As FileInfo()
    16. fi = di.GetFiles("*.pdf*", SearchOption.AllDirectories)
    17. Dim fo As FileObject = Nothing
    18. ToolStripDropDownButton1.DropDownItems.Clear()
    19. For i As Integer = 0 To fi.Length - 1
    20. fo = New FileObject()
    21. fo.Name = fi(i).Name
    22. fo.Text = fi(i).Name
    23. fo.Path = fi(i).DirectoryName
    24. ToolStripDropDownButton1.DropDownItems.Add(fo)
    25. AddHandler fo.Click, AddressOf fo_click
    26. Next i
    27. End Sub
    28. End Class

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

    @Sam85 DropDownOpening ???
    Bei mir läuft dies:

    VB.NET-Quellcode

    1. Private Sub ToolStripDropDownButton1_Click(sender As Object, e As EventArgs) Handles ToolStripDropDownButton1.Click
    2. Dim di As DirectoryInfo = New DirectoryInfo(str)
    3. Dim fi = di.GetFiles("*.pdf*", SearchOption.AllDirectories)
    4. Me.ToolStrip1.SuspendLayout()
    5. ToolStripDropDownButton1.DropDownItems.Clear()
    6. For i As Integer = 0 To fi.Length - 1
    7. Dim fo = New FileObject()
    8. fo.Name = fi(i).Name
    9. fo.Text = fi(i).Name
    10. fo.Path = fi(i).DirectoryName
    11. ToolStripDropDownButton1.DropDownItems.Add(fo)
    12. AddHandler fo.Click, AddressOf fo_click
    13. Next
    14. Me.ToolStrip1.ResumeLayout(False)
    15. Me.ToolStrip1.PerformLayout()
    16. End Sub
    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!
    @RodFromGermany
    Gelaufen sind beide, nur beim Button hatte ich eine minimale Verzögerung sobald ich den Button betätigt habe. Beim Opening, hab ich diese Verzögerung nicht.
    Hmm jetzt wo ich mir deinen Code genau schaue...

    VB.NET-Quellcode

    1. Me.ToolStrip1.SuspendLayout()
    2. ToolStripDropDownButton1.DropDownItems.Clear()


    ich hatte das Suspend nach dem Clear stehen gehabt...könnte es daran gelegen haben? Muss ich nachher mal testen.

    Sam85 schrieb:

    könnte es daran gelegen haben?
    Nein.
    Das ist im Prinzip egal.
    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!