Toon posts:

[C#] Menu lijstje maken at runtime

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hmm, 'k probeer at runtime een lijstje te maken van hooguit 5 items die dan achter een bepaald menuutje moeten komen. Ik heb daarvoor met de Menu editor van VS.NET een voorbeeld item gemaakt en deze clone ik vervolgens (MenuItem.CloneMenu()) en van het item wat dan ontstaat verander ik een aantal eigenschappen en die voeg ik dan vervolgens toe aan de MenuItems property van het menu waar deze onder moet staan. Het probleem is nu alleen even hoe ik de events af handel. Want dat voorbeeld menu item heeft wel een eventhandler, en die geld dan ook automatisch voor alle items die daarvan gecloned zijn, maar het probleem is dat ik binnen die eventhandler niet kan bepalen op welk item er nu precies geklikt is.

Even een stukje code voor het maken van het menu:
code:
1
2
3
4
5
6
7
8
9
10
11
12
int counter = 0;
foreach (Favorite tempfavorite in MonitorSettings.Favorites) 
{
    counter++;
    MenuItem newmenu = mnuQuickConnectExample.CloneMenu();
    newmenu.Text = tempfavorite.name; newmenu.Visible = true;
    mnuQuickConnect.MenuItems.Add(newmenu);
    if (counter == 5) 
    {
        break;
    }
}

Maar in de event handler kan ik dus niet bepalen op welk menu er nu precies geklikt is. Moet ik dan dus 5 verschillende event handlers maken of is er een betere manier voor?

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Je zou de Index property van MenuItem kunnen gebruiken om te bepalen waarop geklikt is.

Je kunt ook een nieuwe klasse afleiden van MenuItem (RecentMenuItem oid) met een handige property.

Verwijderd

Topicstarter
Je zou de Index property van MenuItem kunnen gebruiken om te bepalen waarop geklikt is.
Het probleem is dus dat in de event handler niet te bepalen is om welk MenuItem object het nou precies gaat.
code:
1
2
3
4
private void mnuQuickConnectExample_Click(object sender, System.EventArgs e)
{
    
}

Daar kan ik dus niet aan zien welk MenuItem het nu is aangezien e dat niet bevat.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
code:
1
2
3
4
5
6
private void mnuQuickConnectExample_Click(object sender, System.EventArgs e)
{
    MenuItem mi = (MenuItem)sender;
    int index = mi.Index;
    ...bla bla bla...
}

Verwijderd

Topicstarter
Op zondag 09 juni 2002 17:01 schreef marcusk het volgende:
code:
1
2
3
4
5
6
private void mnuQuickConnectExample_Click(object sender, System.EventArgs e)
{
    MenuItem mi = (MenuItem)sender;
    int index = mi.Index;
    ...bla bla bla...
}
Dat werkt idd prima :). Bedankt voor de tip. Ik dacht dat sender altijd een System.Object was waar je niets mee kon :).

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
sender is het object die verantwoordelijk is voor het triggeren van de event. (Het object dus waar de event van toepassing op is). Correct me if i'm wrong or incomplete here. :)

object is de 'root' van alle .NET classes, dus ook van die MenuItem class. (maw, alle .NET classes zijn afgeleid van object).

Als je zeker weet dat die sender in uw eventhandler van het type MenuItem is, dan kan je zonder probleem gaan casten.

Om het eigenlijk nog veiliger te maken, zou je het ook als volgt kunnen doen:
code:
1
2
3
4
5
if (sender is MenuItem)
{
  MenuItem mi = (MenuItem)sender;
  ...
}

(disclaimer: er kunnen syntaxfouten in zitten, al een lange tijd geen C# meer gedaan, maar het is gewoon het idee dat ik wou aangeven).

https://fgheysels.github.io/


Verwijderd

Topicstarter
Mjah, dat System.Object de root van alle classes in .NET was, was 'k inmiddels wel achter :).

Ennuhm, het lijkt mij redelijk zeker dat sender een MenuItem is in dit geval, aangezien het een eventhandler van een MenuItem is, dus kan het weinig anders zijn, tenzij de void aangeroepen wordt vanuit een andere void, maar dan kun je sender zelf weer opgeven.
Pagina: 1