AddHandler funktioniert nicht

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Thisoft.

    AddHandler funktioniert nicht

    Hallo zusammen,

    ich bin momentan gerade am Verzweifeln, was das Zuordnen eines Events zu einem zur Laufzeit erstellten Menüeintrag betrifft.

    VB.NET-Quellcode

    1. Dim VarMnuNeu As New ToolStripMenuItem
    2. VarMnuNeu.Text = "Variante hinzufügen"
    3. VarMnuNeu.Name = "mnuVarNeu"
    4. mnuVars.DropDownItems.Add("Variante hinzufügen")
    5. AddHandler VarMnuNeu.Click, AddressOf NeueVariante


    Hab's auch schon damit versucht:

    VB.NET-Quellcode

    1. AddHandler mnuVarNeu.Click, AddressOf NeueVariante


    VB.NET-Quellcode

    1. Private Sub NeueVariante()
    2. Dim Varneu As Integer = 2 ^ (grpVar.Controls.Count)
    3. ExecSQL("UPDATE Kavitaeten SET Varianten = Varianten Or " & Varneu & " WHERE WzNummer = '" & AktWzNr & "' And ID =" & AktID)
    4. KavPanelLaden()
    5. End Sub


    Ich habe das Ganze schon des Öfteren gemacht und es hat geklappt. Nur diesmal wird die Sub einfach nicht gefeuert wenn ich auf den Menüeintrag klicke.
    Kann mir da bitte mal jemand auf den Trichter helfen?
    Vielleicht sehe ich auch nur den Wald vor lauter Bäumen nicht...

    Gruß und Danke
    Thilo
    Option Strict On
    Fehler 1 Die Signatur der Private Sub NeueVariante()-Methode ist mit dem Delegaten "Delegate Sub EventHandler(sender As Object, e As System.EventArgs)" nicht kompatibel.

    ==>

    VB.NET-Quellcode

    1. Private Sub NeueVariante(ByVal sender As System.Object, ByVal e As System.EventArgs)
    2. ' ...
    3. 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!
    Oh, ja sorry...

    so hatte ich es ursprünglich drin und es funtkionierte auch nicht.

    Ich habe die Methodendeklaration auch jetzt wieder geändert und es funktioniert trotzdem nicht :(

    Das mit "Option Strict On" ist natürlich in dem Falle hilfreich - will ich gar nicht bestreiten. Mich nerven nur Fehlermeldungen wie z.B. hier:

    VB.NET-Quellcode

    1. AktVar = Math.Log(KavDaten.Rows(i).Item("Varianten"), 2) + 1


    Das entsprechende Db-Feld ist vom Typ Integer - da kann nix anderes als eine Zahl drinstehen und somit halte ich es für überüberflüssig das nochmal zu casten.
    Ich weiß, gleich krieg ich Haue...
    Das entsprechende Db-Feld ist vom Typ Integer - da kann nix anderes als eine Zahl drinstehen und somit halte ich es für überüberflüssig das nochmal zu casten.
    Ich weiß, gleich krieg ich Haue...
    Jo, kann schon sein :cursing:

    Im Ernst: So weh täte es nicht, da einen Cast reinzuschreiben (der ja auch tatsächlich stattfindet - so oder so). Dafür kannste das unnütze ".Item" weglassen - ist das nun soo viel schlimmer?

    VB.NET-Quellcode

    1. AktVar = Math.Log(CDbl(KavDaten.Rows(i)("Varianten")), 2) + 1

    Schlechter Stil ist das allemal, denn bei Verwendung typisierter Datasets würde eine KavDatenRow ihre Property .Varianten von vornherein als Double publizieren:

    VB.NET-Quellcode

    1. AktVar = Math.Log(tblKavDaten(i).Varianten, 2) + 1


    Thisoft schrieb:

    Kann mir da bitte mal jemand auf den Trichter helfen?
    Vielleicht sehe ich auch nur den Wald vor lauter Bäumen nicht...

    Alles über Events

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

    Hallo Erfinder,

    jaa - den Cast reinzuschreiben würde nicht gerade weh tun. Aber das Gute für mich - ich habe was dazugelernt ;) Nämlich dass man das ".Item" weglassen kann - da wäre ich glaube nie drauf gekommen (IntelliSense sei Dank...). 1:0 für Dich, und wer weiß, vielleicht gewöhne ich mich ja wirklich noch an Option Strict On :S

    Was das (nicht) typisierte Dataset betrifft: Ich habe mir eine Funktion gemacht, die mir aus einem SQL-String eine Datatable zurückgibt. Die nutze ich gerne wenn ich nur mal einige Infos zu einzelnen Datensätzen dazuholen will die nicht weiter bearbeitet werden sollen. Ich denke, dass es da den Aufwand nicht lohnen würde, da jedesmal entsprechend zu typisieren - oder?

    Nun nochmal zu meinem eigentlichen Problem. Ich habe mir Deinen Link zu Gemüte geführt und zugegebenermaßen noch nicht ganz Alles verstanden. Speziell die Sache mit:

    VB.NET-Quellcode

    1. If .Text.All(Function(c) allowed.Contains(c)) Then

    muss ich mir mal in ein eigenes Beispiel einbauen damit ich's (hoffentlich) verstehe...

    Ich kann aber trotzdem jetzt nicht herausfinden, was ich falsch gemacht habe :( Natürlich habe ich jetzt die Signatur wieder geändert:

    VB.NET-Quellcode

    1. Private Sub NeueVariante(ByVal sender As System.Object, ByVal e As System.EventArgs)
    2. Dim Varneu As Integer = 2 ^ (grpVar.Controls.Count)
    3. ExecSQL("UPDATE Kavitaeten SET Varianten = Varianten Or " & Varneu & " WHERE WzNummer = '" & AktWzNr & "' And ID =" & AktID)
    4. KavPanelLaden()
    5. End Sub


    Ich komme nicht drauf, wo jetzt mein Fehler liegt...
    Guten Morgen,

    ich hab's rausgefunden. Der Fehler saß wie immer vor dem Bildschirm, und zwar hier nochmal der Code aus dem ersten Posting:

    VB.NET-Quellcode

    1. Dim VarMnuNeu As New ToolStripMenuItem
    2. VarMnuNeu.Text = "Variante hinzufügen"
    3. VarMnuNeu.Name = "mnuVarNeu"
    4. mnuVars.DropDownItems.Add("Variante hinzufügen")
    5. AddHandler VarMnuNeu.Click, AddressOf NeueVariante


    Fällt Euch in Zeile 4 was auf? Ich Trottel habe einen ganz anderen Menüeintrag als den bearbeiteten hinzugefügt der nur eben dummerweise genau so hieß wie erwartet.

    Gruß Thilo