C# - Menüpontok létrehozása programból

forráskód letöltése
Mellékelt példában annak járunk utána, hogy miként hozhatunk létre tetszőleges menüpontokat programból.
Amikor a button1-re kattintunk a mellékelt példaprogramban, akkor jönnek létre az új menüpontok. Ezt úgy érjük el, hogy a már meglévő File nevű menüpont mellé létrehozunk egy A és egy B nevű menüpontot, majd ezekhez egy-egy legördülő menübe még néhány menüpontot.
Kell tehát két új fő menüpont. Ehhez létrehozunk egy mainMenuItems nevű tömböt, mely MenuItem típusú osztályokat tárol és ezekből is két darabot. Az egyes elemeknek történő érték adáshoz létrehoztunk egy CreateAMenu és CreateBMenu belső függvényt, melyek elvégzik a szükséges menüpontok létrehozását a két főmenühöz. Miután ez megtörténik már csak hozzá kell adnunk e két fő menüpontot a mainMenu1 komponensben tárolt elemekhez. Ehhez a MenuItems property Add függvényét használjuk, melynek paraméterként megadjuk a lokális mainMenuItems változónkban tárolt menüpontokat. Ezzel az új menük hozzáadása meg is történt, azok láthatók, használhatók.
      protected void button1_Click (object sender, System.EventArgs e)
      {
        MenuItem [] mainMenuItems = new MenuItem[2];
        mainMenuItems[0] = CreateAMenu();
        mainMenuItems[1] = CreateBMenu();
        mainMenu1.MenuItems.Add(mainMenuItems[0]);
        mainMenu1.MenuItems.Add(mainMenuItems[1]);
        button1.Enabled = false;
      }
Nézzük most, hogy miként jön létre egy-egy fő menü és a hozzá tarozó legördíthető menüpontok. Ehhez hoztuk létre a CreateAMenu és CreateBMenu belső függvényeket. A CreateAMenu-nél szintén egy lokális változóba létrehoztunk egy olyan tömböt, mely képes három menüpont tárolására. Mindegyik elembe egy-egy új MenuItem osztályt hozunk létre. Egy új menüpont létrehozásakor, annak konstruktoránál adhatjuk meg a legjellemzőbb értékeket a létrehozandó menüpont számára. Így az első paraméterben a megjelenő feliratát, a másodikban hozzárendelhetünk egy új esemény kezelő függvényt a Click eseményéhez, míg harmadik paraméterben megadhatunk egy billentyű kombinációt, mellyel szintén aktiválható a menüpont. A Click eseményhez tartozó eseménykezelő függvényeket, minden menüponthoz létrehozzuk OnAOne, OnATwo és OnAThree névvel.
Végül létrehozunk egy újabb lokális változót, melybe egyetlen menüpont kerül tárolásra, méghozzá a fő menüpont. Ezt úgy hozzuk létre, hogy a MenuItem osztály egy másik konstruktorát használjuk fel, melynek paraméterezése a következőképpen alakul: először itt is a menü felirata kerül átadásra, másodszor a Click eseményhez tartozó függvény, mely most null, mivel egy fő menühöz nem szokás Click eseményt kezelni, mert az egy legördülő menüt nyit meg. Végül harmadik paraméterként egy MenuItem elemeket tartalmazó tömböt adhatunk meg, mely az imént létrehozott menüpontokat tartalmazó aMenuItem lokális változó lesz.
      private MenuItem CreateAMenu()
      {
        MenuItem[] aMenuItems = new MenuItem[3];
        aMenuItems[0] = new MenuItem("&One", new EventHandler(OnAOne), Shortcut.CtrlO);
        aMenuItems[1] = new MenuItem("&Two", new EventHandler(OnATwo), Shortcut.CtrlT);
        aMenuItems[2] = new MenuItem("&Three", new EventHandler(OnAThree), Shortcut.CtrlH);
        MenuItem aMenu = new MenuItem("&A", aMenuItems);
        return aMenu;
      }
A B menüpont létrehozása ugyanúgy történik, mint az A menüponté, egyetlen különbséggel. Itt mind a három új menüponthoz ugyanazt az eseménykezelő függvényt rendeljük hozzá. Ennek az a jelentősége, hogy ha olyan menüpontjaink vannak, melyek funkciói hasonlóak, akkor ezekhez rendelhetjük ugyanazt az eseménykezelőt, majd ennek futásánál szükség szerint el tudjuk ágaztatni a programunk futását, felhasználva azt az információt, hogy melyik menüpont lett kiválasztva.
      private MenuItem CreateBMenu()
      {
        MenuItem[] bMenuItems = new MenuItem[3];
        bMenuItems[0] = new MenuItem("1", new EventHandler(OnB123), Shortcut.CtrlA);
        bMenuItems[1] = new MenuItem("2", new EventHandler(OnB123), Shortcut.CtrlB);
        bMenuItems[2] = new MenuItem("3", new EventHandler(OnB123), Shortcut.CtrlC);
        MenuItem bMenu = new MenuItem("&B", bMenuItems);
        return bMenu;
      }
Az A menühöz tartozó Click eseménykezelő függvények egyszerűen csak egy üzenet ablakban megjelenítik az adott eseménykezelő függvény nevét, így követhetjük, hogy melyik menüpont lett kiválasztva.
      public void OnAOne(Object source, EventArgs evtArgs)
      {
        MessageBox.Show("OnAOne");
      }
Ehhez persze igen felesleges munka három eseménykezelő eljárást készíteni. Így célszerűbb a B menüponthoz tartozó legördíthető menüknél látható Click eseménykezelés, melyeknél csupán egyetlen függvény lett hozzárendelve, ennek ellenére mindig tudni fogjuk, hogy melyik menüpont lett kiválasztva, mivel paraméterként kapunk egy source változót, melyben mindig az a menüpont objektum lesz MenuItem típusban, melyet a felhasználó kiválasztott.
      public void OnB123(Object source, EventArgs evtArgs)
      {
        MessageBox.Show((source as MenuItem).Text);
      }