2016-04-23 12 views
1

Ich habe ein dynamisches Label auf Knopfdruck auf Windows Form erstellt. Und dann auf einen Rechtsklick auf das Etikett. Ich zeige ein Kontextmenü "cm". Offensichtlich möchte ich den Kontextmenüs Funktionalität hinzufügen. Aber was ich nicht verstehe, ist, wie referenziere ich das "lbl" -Objekt innerhalb des Event-Handlers? Wie kann ich die Eigenschaften der Beschriftungen innerhalb der Ereignishandler namens MarkedImportant und EditLabel bearbeiten?Wie erstellt man den Event-Handler für die Bearbeitung dynamischer Labels in C#?

public void btnMonSub_Click(object sender, EventArgs e) 
{ 
    string s = txtMonSub.Text; 
    Label lbl = new Label(); 
    lbl.Text = s; 
    lbl.Location = new System.Drawing.Point(205 + (100 * CMonSub), 111); 
    CMonSub++; 
    lbl.Size = new System.Drawing.Size(100, 25); 
    lbl.BackColor = System.Drawing.Color.AliceBlue; 
    this.Controls.Add(lbl); 

    ContextMenu cm = new ContextMenu(); 
    cm.MenuItems.Add("Mark Important", MarkImportant); 
    cm.MenuItems.Add("Edit", EditLabel); 

    lbl.ContextMenu = cm; 
} 

private void MarkImportant(object sender, EventArgs e) 
{ 
    // imp.. 
} 

private void EditLabel(object sender, EventArgs e) 
{ 
    // edit.. 
} 

Oder gibt es einen besseren Weg, dies zu tun? Wie dynamisch den Event-Handler selbst hinzufügen?

Vielen Dank im Voraus.

+0

Was dieses Ereignis verbunden ist? Es scheint ein Ereignis auf einer Schaltfläche zu sein, aber Sie möchten auf eine mit dieser Schaltfläche verknüpfte Bezeichnung zugreifen. Sie können auf das Label entweder durch seine Instanz zugreifen, oder wenn Sie es dynamischer benötigen, müssen Sie das Label mit dem Button verknüpfen. Das könnte auf verschiedene Arten geschehen. Der beste Weg wäre vollständig darauf angewiesen, wie Ihre Anwendung gestaltet ist und welche Anforderungen Sie haben. – gmiley

+0

Sie können es über 'Objekt Absender' abrufen. Schauen Sie sich [diese ausführliche Antwort] (http://stackoverflow.com/a/4886417/594832) an, die es sehr gut beschreibt. – khlr

+0

@khlr nicht möglich. Der Event-Handler ist an ein ContextMenu angehängt, der Sender ist das ContextMenu. – Steve

Antwort

1

Die ContextMenu hat eine Eigenschaft namens SourceControl und MSDN sagt, es

die Steuerung ab, der das Kontextmenü angezeigt wird.

So Ihre Event-Handler könnte die ContextMenu reichen von der MenuItem als Absender Parameter übergeben auf diese Weise

private void MarkImportant(object sender, EventArgs e) 
{ 
    // Convert the sender object to a MenuItem 
    MenuItem mi = sender as MenuItem; 
    if(mi != null) 
    { 
     // Get the parent of the MenuItem (the ContextMenu) 
     // and read the SourceControl as a label 
     Label lbl = (mi.Parent as ContextMenu).SourceControl as Label; 
     if(lbl != null) 
     { 
      .... 
     } 
    } 
} 
+0

Können Sie erklären, wonach die if-Anweisung eigentlich sucht? Und ich muss nur das Etikett bearbeiten. Bearbeiten Sie das Label, auf das der Benutzer mit der rechten Maustaste geklickt hat. Ändern Sie grundsätzlich die Eigenschaften dieses bestimmten Labels. –

+0

Verhindern von 'NullReferenceException' – gmiley

+0

Es ist eine Angewohnheit. In diesem Zusammenhang wird wahrscheinlich jeder vorhandene Objektverweis null sein, aber das Hinzufügen einer einfachen Überprüfung auf Nullen ist ein Lebensretter, den Sie verwenden, wenn Sie sich am falschen Ende eines Telefonanrufs mit einem verärgerten Kunden befinden – Steve