jasso Geschrieben 22. März 2007 Teilen Geschrieben 22. März 2007 hallo leute, ich lege menüpunkte in einem programm dynamisch fest (es steht also nicht fest wie viele menüopunkte das werden). und möchte diese natürlich beim klick auf die einzellnen menüpunkte abarbeiten können. wie mach ich das? momentaner code: Private WithEvents cmi_zwischen As System.Windows.Forms.MenuItem ... uebermenuepunkt.MenuItems.Clear() mi_arr = New ArrayList; i = 0 Do While i < x cmi_zwischen = New System.Windows.Forms.MenuItem("eintrag" & i) mi_arr.Add(cmi_zwischen) uebermenuepunkt.MenuItems.Add(cmi_zwischen) i += 1 Loop wenn ich jetzt eine sub zum als menüklickereignis erstelle: Private Sub cmi_zwischen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmi_zwischen.Click Try MsgBox("test") Catch err As SystemException MsgBox(err.ToString) End Try End Sub wird diese natürlich nur für den zuletzt eingetragenen menüpunkt aufgerufen. wie frage ich jedoch die click-ereignisse der anderen dynamischen menüeinträge ab? danke lg jasso Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 22. März 2007 Teilen Geschrieben 22. März 2007 Hallo, lass dir nach dem erstellen des jeweiligen SubItems das Handle desselben zurückgeben. In c# kann man das per MenuItem.Handle abfragen. Dann speicherst du die ganzen Handles in einem Array ab. In dem .OnClick-Event switchst du einfach nach dem Handle des jeweiligen Menueintrages und kannst somit feststellen, welcher Menüpunkt angeklickt wurde. Du musst für JEDES Submenü das OnClick-Event auf eine Funktion legen, also die, in der du das obige durchläufst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
jasso Geschrieben 22. März 2007 Autor Teilen Geschrieben 22. März 2007 die handles hab ich jetzt abgefragt und in meinem array gespeichert (geht auch in vb einfach mit .Handle). aber wie muss mein funktionskopf der "universal-menüpunkt-klick" funktion jetzt aussehen? ich kann schließlich nicht einfach:Private Sub menuepunkt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles handlearray.Clickschreiben^^. lg jasso Edit: Du musst für JEDES Submenü das OnClick-Event auf eine Funktion legen, also die, in der du das obige durchläufst. dann ist es aber doch wieder nicht dynamisch wenn ich für jeden untermenüpunkt eine eigene sub brauche oder? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 22. März 2007 Teilen Geschrieben 22. März 2007 die handles hab ich jetzt abgefragt und in meinem array gespeichert (geht auch in vb einfach mit .Handle). aber wie muss mein funktionskopf der "universal-menüpunkt-klick" funktion jetzt aussehen? ich kann schließlich nicht einfach:Private Sub menuepunkt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles handlearray.Clickschreiben^^. lg jasso Edit: dann ist es aber doch wieder nicht dynamisch wenn ich für jeden untermenüpunkt eine eigene sub brauche oder? Doch... es ist dynamisch. Ich meinte, du musst jedem beliebigen SubMenüPunkt dieselbe Funktion zuweisen. Und in dieser .OnClick Funktion castest du den Parameter "sender" nach (MenuItem) und fragst dann das Handle dieses gecasteten MenuItems ab. Dieses ist dann das betätigte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 22. März 2007 Teilen Geschrieben 22. März 2007 In c# sähe die OnClick-Methode etwa so aus: private void OnClick(object sender, EventArgs e) { if((((MenuItem)sender).Handle) == myArray[0].Handle) // hier Code für diesen Menüeintrag else if((((MenuItem)sender).Handle) == myArray[1].Handle) // hier Code für diesen Menüeintrag } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
jasso Geschrieben 22. März 2007 Autor Teilen Geschrieben 22. März 2007 Ich meinte, du musst jedem beliebigen SubMenüPunkt dieselbe Funktion zuweisen.genau da hängts bei mir. ich weiß nicht wie ich das machen soll. wenn einfach die methode onClick überladePrivate Overloads Sub onClick(ByVal sender As System.Object, ByVal e As System.EventArgs) wird diese nicht aufgerufen wenn ich auf (irgend)einen menüpunkt klicke. lg jasso Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 22. März 2007 Teilen Geschrieben 22. März 2007 genau da hängts bei mir. ich weiß nicht wie ich das machen soll. wenn einfach die methode onClick überladePrivate Overloads Sub onClick(ByVal sender As System.Object, ByVal e As System.EventArgs) wird diese nicht aufgerufen wenn ich auf (irgend)einen menüpunkt klicke. lg jasso Du musst die eigentlich nicht überladen. In c# wieder ;-): MenuItem main = new MenuItem("Main"); MenuItem sub1 = new MenuItem("test1"); MenuItem sub2 = new MenuItem("test2"); MenuItem sub3 = new MenuItem("test3"); sub1.Click += new EventHandler(GeneralClickMethode); sub2.Click += new EventHandler(GeneralClickMethode); sub3.Click += new EventHandler(GeneralClickMethode); main.MenuItems.Add(sub1); main.MenuItems.Add(sub2); main.MenuItems.Add(sub3); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
jasso Geschrieben 22. März 2007 Autor Teilen Geschrieben 22. März 2007 aaaaaaahhhhh ... jetzt funktioniert das ganze. danke dir! für alle dies auch in vb brauchen. hier muss ein eventhandler generiert und bereits beim erstellen des menuitem mitgegeben werden (nachträglich ist das in vb soweit ich das gesehen habe nicht möglich):zwischen = New EventHandler(AddressOf generalclick) cmi_zwischen = New System.Windows.Forms.MenuItem("test", zwischen) dann wird die funktion Private Sub generalclick(ByVal sender As System.Object, ByVal e As System.EventArgs) auch für jeden menüpunkt aufgerufen. Handles müssen mit der Funktion ".Equals" verglichen werden. Außerdem ist es wichtig den Menüpunkt vor dem speichern des Handles im Array dem Menü an der richtigen Stelle zuzuordnen:hauptmenuepunkt.MenuItems.Add(cmi_zwischen)allem anschein nach ändert sich bei diesem vorgang das Handle nochmal. lg jasso Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 23. März 2007 Teilen Geschrieben 23. März 2007 schön... war mir eine Freude ;-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.