Fragen zum Addhandler

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    RodFromGermany schrieb:

    Mach Dir testweise ein Menü im Designer und sieh Dir an, wie es vom Automaten aufgebaut wird.
    Das musst Du nachempfinden.

    FreShmaKer schrieb:

    VB.NET-Quellcode

    1. AnsprechpartnerToolStripMenuItem.DropDownItems.Add(item)
    ist ja bereits ein einzelner Menüpunkt, da kommen doch säckeweise Compilerfehler.
    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!
    Ach kommt schon, so schwer ist es doch nicht:

    Man fügt dem ToolStripMenuItem, welches der TE als AnsprechpartnerToolStripMenuItem bezeichnet, ein weiteres ToolStripMenuItem hinzu.

    @ErfinderDesRades: Auch Strings sind möglich (Siehe Bild).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich versteh die ganze Diskussion irgendwie nicht..

    Wenn er das ganze mit WithEvents deklariert, muss er doch garkeinen Eventhandler hinzufügen??
    Er kann das ganze doch einfach so ansprechen:

    VB.NET-Quellcode

    1. WithEvents item As New ToolStripMenuItem
    2. Sub eventbehandlung(ByVal sender As Object, ByVal e As EventArgs) Handles item.Click
    @MarcoQuinten: Das geht aber nur, wenn die Objekte zur Kompilierzeit bereits verfügbar sind (Naj, mit 'nem Workaround könnte man es vielleicht schaffen).
    Veruch mal das:

    VB.NET-Quellcode

    1. Sub Test()
    2. Dim NewItem As New ToolStripMenuItem
    3. NewItem.Bla....
    4. Dings.Add(NewItem)
    5. End Sub
    6. Sub Handler() Handles NewItem.Click
    7. End Sub


    Das ergibt keinen Sinn.

    PS: Die Sache mit Handles läuft beim Kompilieren auf das hinaus:

    C-Quellcode

    1. internal virtual ToolStripMenuItem ExistiertbereitsToolStripMenuItem
    2. {
    3. [DebuggerNonUserCode]
    4. get
    5. {
    6. return this._ExistiertbereitsToolStripMenuItem;
    7. }
    8. [DebuggerNonUserCode]
    9. [MethodImpl(MethodImplOptions.Synchronized)]
    10. set
    11. {
    12. EventHandler value2 = new EventHandler(this.OnExistingClick);
    13. bool flag = this._ExistiertbereitsToolStripMenuItem != null;
    14. if (flag)
    15. {
    16. this._ExistiertbereitsToolStripMenuItem.Click -= value2;
    17. }
    18. this._ExistiertbereitsToolStripMenuItem = value;
    19. flag = (this._ExistiertbereitsToolStripMenuItem != null);
    20. if (flag)
    21. {
    22. this._ExistiertbereitsToolStripMenuItem.Click += value2;
    23. }
    24. }
    25. }

    Beim Zuweisen der Property wird der alte EventHandler vom Event getrennt (falls es einen gibt) und der neue hinzugefügt.
    Es wird also im Endeffekt auch mit AddHandler/RemoveHandler gearbeitet.

    Edit:
    OMG der neue IL-Spy kann VB:

    VB.NET-Quellcode

    1. Friend Overridable Property ExistiertbereitsToolStripMenuItem() As ToolStripMenuItem
    2. <DebuggerNonUserCode()>
    3. Get
    4. Return Me._ExistiertbereitsToolStripMenuItem
    5. End Get
    6. <DebuggerNonUserCode()>
    7. <MethodImpl(MethodImplOptions.Synchronized)>
    8. Set(value As ToolStripMenuItem)
    9. Dim value2 As EventHandler = New EventHandler(Me.OnExistingClick)
    10. Dim flag As Boolean = Me._ExistiertbereitsToolStripMenuItem IsNot Nothing
    11. If flag Then
    12. Me._ExistiertbereitsToolStripMenuItem.Click -= value2
    13. End If
    14. Me._ExistiertbereitsToolStripMenuItem = value
    15. flag = (Me._ExistiertbereitsToolStripMenuItem IsNot Nothing)
    16. If flag Then
    17. Me._ExistiertbereitsToolStripMenuItem.Click += value2
    18. End If
    19. End Set
    20. End Property
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich danke euch allen für eure Hilfe!
    Ich habe nun nochmal in openbook.galileo.de nachgelesen!

    VB.NET-Quellcode

    1. Private WithEvents mItem As New MenuItem
    2. Private Sub bla()
    3. Dim item As New ToolStripMenuItem()
    4. item.Text = "löschen"
    5. AnsprechpartnerToolStripMenuItem.DropDownItems.Add(item)
    6. AddHandler item.Click, AddressOf item_Click
    7. End Sub
    8. Private Sub item_Click(ByVal sender As Object, ByVal e As EventArgs)
    9. MsgBox("löschen geklickt :D")
    10. End Sub


    THEMA ERLEDIGT!
    openbook.galileo.de



    Bitte glaube kein Wort, was dort erzählt wird. (Naja, so extrem ist es jetzt auch wieder nicht)
    Das Galileo Openbook ist bekannt dafür, schlechten Stil zu verbreiten.
    Die "Fehlerbehandlung" hier ist der beste Beweis dafür.

    home.arcor.de/eckardahlers/Programmer/Blogs/BuchLesen.html
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils