Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

vb.net menüpunkte dynamisch anlegen

Empfohlene Antworten

Veröffentlicht

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

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.

  • Autor

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.Click

schreiben^^.

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?
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.Click

schreiben^^.

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.

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

}

  • Autor
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 überlade

Private 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

genau da hängts bei mir. ich weiß nicht wie ich das machen soll.

wenn einfach die methode onClick überlade

Private 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);

  • Autor

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.