Autor Beitrag
kingdave2nd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Mi 08.06.11 08:40 
Hi zusammen,

vielleicht stelle ich jetzt grade ne total dumme Frage, ich machs aber trotzdem:

Ich habe einen Satz von MenuItems die ich an mehreren Stellen verwenden möchten. Zum Beispiel in einem Kontextmenu und einem MenuStrip. Ich habe nun eine Liste in der alle MenuItems drinstecken und jedes Control was dieses Satz von MenuItems braucht kann die von mir in der Liste implementierte Methode "ToMenuItemArray" aufrufen (um dann dass erhaltene Array in seinem eigenen Menu and die Methode AddRange zu übergeben).
Soweit so gut. Nach einigem debuggen habe ich aber folgendes festgestellt:
Sind meine MenuItems schon in einem ContextMenu eingebaut und ich füge sie in einem MenuStrip eines anderen Controls hinzu, werden Sie aus dem ContextMenu gelöscht. Mein Fazit: MenuItems dürfen nur Mitglied eines Menus sein.
Also bin ich nun in meine "ToMenuItemArray" Methode gegangen und habe mit dem Array-Methoden "CopyTo" und "Clone" rumgespielt um festzustellen, dass die Arrays nur referenzen kopieren und nicht die MenuItem-Objekte doppelt im Speicher anlegen. Die Idee war aber, ein neues Array mit identische Objekten anzulegen. Das hat natürlich zur Folge, dass ich nach wie vor meine MenuItems nur in einem der beiden Menus auftauchen. Nun folgende Fragen dazu:

1) Ist das ganze Vorgehen überhaupt sinnvoll? Macht man das wirklich so, dass die MenuItems kopiert werden?

2) Wie kopiere ich ein Array physikalisch? Google spukt mir immer nur Beiträge (ala Galileo) aus, die mir erklären dass die Methode CopyTo nur Referenzen kopiert (wo ich aber schon selber drauf gekommen bin ;-)...

Vielen Dank schon mal im voraus

Gruss Dave
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 08.06.11 09:26 
Hallo Dave,

ja es stimmt, ein MenuItem (bzw. jedes andere Window-Control auch) kann nur genau einem anderen Windows-Control (Parent) zugeordnet sein.
Die einzige Möglichkeit besteht darin, eine eigene Copy-Methode zu schreiben, welche alle relevanten Eigenschaften (und evtl. Ereignisse) kopiert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
ToolStripMenuItem CopyMenuItem(ToolStripMenuItem source)
{
  ToolStripMenuItem item = new ToolStripMenuItem();
  item.Text = source.Text;
  // alle weiteren relevanten Eigenschaften und Ereignisse

  return item;
}

Anschließend dann in einer Schleife diese Methode für alle MenuItems aufrufen und in das andere Menu eintragen (alternativ das Menu als Parameter übergeben und der Eigenschaft 'Parent' zuweisen).
kingdave2nd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Do 09.06.11 22:48 
Das beantwortet meine Befürchtung. Allerdings muss ich zugeben, dass mein Ansatz vielleicht auch nicht optimal war. Ich baue jetzt die MenuStrip Klassen erst zusammen, wenn das gewünschte Menu geöffnet wird. Eigentlich eine ganz einfache Lösung, habe nur irgendwie völlig verquer gedacht ;-)

gruss David