ToolStripDrowpDownButtons und Items dynamisch adden

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von razzzer530i.

    ToolStripDrowpDownButtons und Items dynamisch adden

    Moin Leute,

    ich mache es kurz:

    Habe eine Ini Datei in der ich Daten habe. Ich erzeuge mit Hilfe der Ini Datei ToolStripDropDownbuttons mit subbuttons.

    VB.NET-Quellcode

    1. For Each item In My.Forms.Form1.ToolStrip1.Items.OfType(Of ToolStripDropDownButton)
    2. For Each ro As DataRow In btns.Rows
    3. If item.Text = ro.Item(0).ToString Then
    4. item.DropDownItems.Add(ro.Item(1).ToString)
    5. End If
    6. Next
    7. Next


    in ro.item(2) habe ich den Pfad gespeichert, den ich beim Klick auf den erzeugten Button öffnen möchte. Bzw. möchte ich eine Funktion beim Klick aufrufen, die diesen Pfad verarbeitet.
    bei item.DropDownItems.Add(ro.Item(1).ToString) kann ich aber leider kein Tag mit übergeben.


    Wie kann ich das sauber lösen? Kann ich vlt. doch ein Tag mit übergeben? Wie handle ich die ganzen später erstellen ToolStripDropDownItems am leichtesten?




    ///Edit

    So gehts:

    VB.NET-Quellcode

    1. For Each item In My.Forms.Form1.ToolStrip1.Items.OfType(Of ToolStripDropDownButton)
    2. For Each ro As DataRow In btns.Rows
    3. If item.Text = ro.Item(0).ToString Then
    4. Dim newchild = New ToolStripMenuItem()
    5. newchild.Text = ro.Item(1).ToString
    6. newchild.Tag = ro.Item(2).ToString
    7. item.DropDownItems.Add(newchild)
    8. End If
    9. Next
    10. Next


    Problem ist jetzt. Wie spreche ich alle buttons an und sage ihnen: wenn du gedrücktwirst führe Funktion x mit Parameter y aus ? :D
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    Hi,
    füge einen AddHandler vom .Click event hinzu (z.Bsps. OnClick) und im OnClick Event fragst Du den sender.tag ab und reagierst dann entsprechend.
    in etwa so:

    VB.NET-Quellcode

    1. AddHandler newchild.Click, AddressOf OnClickLB

    VB.NET-Quellcode

    1. Private Sub OnClickLB(ByVal sender As Object, ByVal e As EventArgs)
    2. Dim id = sender.tag
    3. select case id
    4. case "wasweisich"
    5. 'tu was
    6. end select
    7. End Sub
    "Hier könnte Ihre Werbung stehen..."
    @MichaHo
    Verstehe wie du dir das denkst, verstehe aber nicht wie ich nen eventhandler einbaue. Bzw. habe das wirklich noch nie gemacht und mich immer vor gedrückt weil ich es nicht verstehe.

    VB.NET-Quellcode

    1. For Each item In My.Forms.Form1.ToolStrip1.Items.OfType(Of ToolStripDropDownButton)
    2. For Each ro As DataRow In btns.Rows
    3. If item.Text = ro.Item(0).ToString Then
    4. Dim newchild = New ToolStripMenuItem()
    5. newchild.Text = ro.Item(1).ToString
    6. newchild.Tag = ro.Item(2).ToString
    7. item.DropDownItems.Add(newchild.Text)
    8. End If
    9. Next
    10. Next


    Wie genau baue ich einen Eventhandler ein? und was genau bewirkt das ganze? Wie muss ich mir das vorstellen?
    Erklärung wäre spitze :)
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    Wie genau baue ich einen Eventhandler ein?
    Du gehst in den Designer und wählst bei den Eigenschaften oben die Events aus. Dann suchst Du Dir das richtige Event raus und doppelklickst darauf.
    So hast Du das Event sboniert und den Rahmen des Eventhandlers vom Designer implementieren lassen.
    Diesen musst Du noch ausfüllen und feddich.
    Die andere Variante über AddHandler ist völlig äquivalent, nur musst Du Dich um die Signatur des Eventhandlers alleine kümmern.
    Wenn über das Control nun das entsprechende Event ausgelöst wird, kommt der Program Flow in Deinem Eventhandler vorbei und Dein Code wird abgearbeitet.
    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!
    Also zum Verständnis hat mir das sehr geholfen vielen Dank.
    Aber

    Ich führe in meinem FormLoad Event folgenden Code aus:

    VB.NET-Quellcode

    1. For Each item In My.Forms.Form1.ToolStrip1.Items.OfType(Of ToolStripDropDownButton)
    2. For Each ro As DataRow In btns.Rows
    3. If item.Text = ro.Item(0).ToString Then
    4. Dim newchild = New ToolStripMenuItem()
    5. newchild.Text = ro.Item(1).ToString
    6. newchild.Tag = ro.Item(2).ToString
    7. AddHandler newchild.Click, AddressOf handlex
    8. item.DropDownItems.Add(newchild.Text)
    9. End If
    10. Next
    11. Next


    dazu kommt die sub

    VB.NET-Quellcode

    1. Private Sub handlex(byVal sender as Object, byVal e as EventArgs)
    2. MsgBox("hier")
    3. End Sub



    Funktioniert nicht.
    Habe ca. 30 buttons. Irgendeine Idee was da nicht stimmt ?


    // EDIT
    Ich entschuldige mich für meine unübertreffbare Unfähigkeit, zwischen einem Item und einem String unterscheiden zu können...
    ich so item.DropDownItems.Add(newchild.text)
    dabei sollte es so Item.DropDownItems.Add(newchild)
    und in der Handler Sup muss ich dann natürlich nicht das Object abfragen sondern das ToolStripItem...

    Danke für die super Hilfe!

    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    razzzer530i schrieb:

    in meinem FormLoad Event
    Form_Load spinnt, das ist ein MS-Fehler und bekannt. Nimm mal das Form_Shown-Event, da müsste bei nem Fehler eine saubere Exception kommen.
    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 schrieb:

    Form_Load spinnt, das ist ein MS-Fehler und bekannt. Nimm mal das Form_Shown-Event, da müsste bei nem Fehler eine saubere Exception kommen.


    Habe den Fehler ja gefunden. Wenn ein Fehler vorhanden ist, kriege ich durch Form_Shown ne Exception. Aber hatte halt einen String und kein Item übergeben und konnte somit ja gar kein Click Event auslösen. Thx
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~