2009-06-10 4 views
4

C#: Comment détecter qui est l'appelant de l'élément de menu d'un menu contextuel lorsqu'il est lié à deux objets différents?C#: Comment détecter qui est l'appelant de l'élément de menu d'un menu contextuel lorsqu'il est lié à deux objets différents?

J'ai deux étiquettes, lblOn et lblOff. Je lie un menu contextuel 'one' aux deux labels pour éviter d'en faire deux identiques.

Comment irais-je après avoir découvert quel objet label appelé contextmenu.menuitem? De cette façon le cliqué sur menuitem sait si c'est le menu contextuel qui a été appelé par le label lblOn ou lblOffline?

Répondre

15

Vérifiez la propriété SourceControl du ContextMenuStrip.

+0

si la source est un datagridview, comment puis-je dire à quelle ligne ou cellule? – Maslow

6

Ignorer. Après avoir parcouru un peu plus, j'ai trouvé une solution + un exemple de code.

private void deleteToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    //Make sure the sender is a ToolStripMenuItem 
    ToolStripMenuItem myItem = sender as ToolStripMenuItem; 
    if (myItem != null) 
    { 
     //Get the ContextMenuString (owner of the ToolsStripMenuItem) 
     ContextMenuStrip theStrip = myItem.Owner as ContextMenuStrip; 
     if (theStrip != null) 
     { 
      //The SourceControl is the control that opened the contextmenustrip. 
      //In my case it could be a linkLabel 
      LinkLabel linkLabel = theStrip.SourceControl as LinkLabel; 
      if (linkLabel == null) 
       MessageBox.Show("Invalid item selected.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      else 
      { 
       if (MessageBox.Show(string.Format("Are you sure you want to remove BOL {0} from this Job?", linkLabel.Text), "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) 
       { 
        linkLabel.Text = Program.NullValue(linkLabel); 
       } 
      } 
     } 
    } 
} 

Source: http://www.tek-tips.com/viewthread.cfm?qid=1441041&page=8

2

Je sais que cela est une question de beaucoup il y a des lunes, mais je ne ai pas vraiment été en mesure de trouver une réponse simple avec le code ... Je sais SLaks ont fait genre de celui-ci out, mais je pense que d'autres là-bas ont besoin d'un échantillon de code ...

Je voulais savoir qui a appelé le menu contextuel entre une zone de texte riche ou une étiquette. La raison en est que je ne voulais qu'un seul menu contextuel et que le bouton de copie à l'intérieur de celui-ci était désactivé si l'appelant était la zone de texte riche sans rien sélectionné.

Heres mon code:

private void contextMenuStrip1_Opened(object sender, EventArgs e) 
    { 
     //get the context menu (it holds the caller) 
     ContextMenuStrip contextMenu = sender as ContextMenuStrip; 
     //get the callers name for testing 
     string controlName = contextMenu.SourceControl.Name; 

     //test if it is infact me rich text editor making the call. 
     if (controlName == "text_rchtxt") 
     { 
      //if I have nothing selected... I should not be able to copy 
      if (text_rchtxt.SelectedText == "") 
       copy_shrtct.Enabled = false; 
     } 
     else 
     { 
      //if I do have something selected or if its another control making the call, enable copying 
      copy_shrtct.Enabled = true; 
     } 
    } 
-1

utiliser ceci:

contextMenuStrip1.SourceControl; 
échantillon

:

using (MemoryStream ms = new MemoryStream()) 
{ 
    Chart chartx = (Chart)stripChart.SourceControl; 
    chartx.SaveImage(ms, ChartImageFormat.Png); 
    Bitmap bm = new Bitmap(ms); 
    Clipboard.SetImage(bm); 
}