2016-06-17 13 views
0

Ich habe zwei ContextMenuStrip (s) in einer Windows Form Application, eine von ihnen hat 3 Elemente und die andere hat keine.C# - ContextMenuStrip Elemente in ein anderes kopieren

ist dies Lassen annehmen:

ContextMenuStrip c1 = new ContextMenuStrip(); 
ContextMenuStrip c2; 

c1 hat 3 ToolStripMenuItems, c2 die ContextMenuStrip Ziel ist, wo c1 Elemente dupliziert werden soll.

habe ich versucht, dies zu schreiben:

c2 = new ContextMenuStrip(c1.Container); 

aber es gibt mir ein ArgumentNullException weil c1.Container zu null gleich ist.

Ich kann nicht herausfinden, wie man das löst, können Sie mir helfen?

Ps. Ich würde new ToolStripMenuItem (s), keine Referenzen

und

while oder foreach Schleifen Lösungen sind nicht der beste Weg, dies zu tun.

Danke

+1

Sie haben irgendwo Code, der das ContextMenuStrip-Objekt erstellt. Ruf es noch einmal an. –

+0

Können Sie mir ein Beispiel geben? –

Antwort

1

Dann. habe eine Funktion, die die Context und nennt es jedes Mal, wenn ein neues Menü

Func<ContextMenuStrip> newContextMenuStrip =() => { 
    var c = new ContextMenuStrip(); 
    c.Items.Add("item 1"); 
    c.Items.Add("item 2"); 
    c.Items.Add("item 3"); 
    return c; 
}; 

var c1 = newContextMenuStrip(); 
var c2 = newContextMenuStrip(); 
+0

Hmm .. Ich werde es versuchen, ich werde dich wissen lassen –

+0

Das ist eine unglaubliche Lösung und es funktioniert perfekt. Ich danke dir sehr :) –

0

:) Sie brauchen eine neue ContextMenuStrip und fügen Sie die Item s (nicht die Container von c1 auf das neue Menü zu erstellen:

c2 = new ContextMenuStrip(); 
c2.Items.AddRange(c1.Items); 

Aber beachten Sie, dass dies tut nicht duplizieren die Artikel Die gleichen Artikel Instanzen sind jetzt in beiden Menüs

Wenn Sie sie klonen möchten, ist das ziemlich kompliziert, da Sie sich um die spezifischen Typen der Elemente kümmern müssen, die Eigenschaften, die Sie klonen möchten, und besonders die Ereignishandler.

könnte ein einfaches Beispiel sein:

c2.Items.AddRange(c1.Items.OfType<ToolStripItem>() 
          .Select(item => new ToolStripMenuItem(item.Text)) 
          .OfType<ToolStripItem>().ToArray()); 

Die zweiten OfType ist notwendig, eine kovarianten Matrix Umwandlung von ToolStripMenuItem[] zu ToolStripItem[] zu vermeiden, die durch AddRange() erwartet wird.


Und eine Randnotiz: Container ist die Komponente, die das Menü enthält (thatswhy es null ist, wenn das Menü nicht angezeigt wird) und nicht das, was das Menü in seine Einzelteile hält

+0

Ja, Sie haben Recht, das gibt mir die gleichen Instanzen, aber nicht neue "geklonten" Instanz .. aber danke :) –

+0

@EdoardoChiabra Um die Elemente zu klonen ist ein wenig komplizierter und ich glaube nicht, dass Sie es tun können " in einer Zeile ". Zuerst müssen Sie sich um den spezifischen Elementtyp kümmern, zweitens müssen Sie wissen, welche Eigenschaften Sie klonen wollen, und dies ist besonders kompliziert für die 'Click'-Event-Handler. –

+0

Ich weiß, dass "one line solution" utopisch ist, was schlägst du vor? Eine Schleife? –

1

spät zur Party, aber ich hatte das gleiche Problem in der Vergangenheit und fand eine reasonab schafft benötigt wird ly einfache Lösung.

Nehmen wir an, Ihr toolStripMenuItem wird in einem Kontextmenü als 'TSMI_open' deklariert, Sie können es effektiv zwischen Kontextmenüs austauschen, wenn sie geöffnet werden. Etwas wie folgt aus:

void Context1_Opening(object sender, CancelEventArgs e) 
{ 
    Context1.Items.Insert(0, TSMI_open); 
} 

void Context2_Opening(object sender, CancelEventArgs e) 
{ 
    Context2.Items.Insert(0, TSMI_open); 
} 

Der Menüpunkt auf beiden Menüs angezeigt wird, wenn sich nahtlos und wird keine Fehler verursachen, wenn das gleiche Menü zweimal hintereinander geöffnet wird.

Verwandte Themen