2016-04-23 11 views
1

Windowsフォームのボタンをクリックすると動的ラベルが作成されました。ラベルを右クリックします。コンテキストメニュー "cm"を表示しています。私は明らかにコンテキストメニュー項目に機能を追加したいと思う。しかし、私が理解できないことは、イベントハンドラ内の "lbl"オブジェクトをどのように参照するのかです。 MarkedImportantとEditLabelという名前のイベントハンドラ内からラベルのプロパティを編集するにはどうすればよいですか?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.. 
} 

これを行うには良い方法がありますか?イベントハンドラ自体を動的に追加するのと同じですか?

ありがとうございます。

+0

を通過したに添付このイベントは何ですか?これはボタンのイベントのように見えますが、そのボタンに関連付けられたラベルにアクセスする必要があります。そのインスタンスでラベルにアクセスすることも、より動的にする必要がある場合は、ラベルをボタンに関連付ける必要があります。それはいろいろな方法で行うことができます。最良の方法は、アプリケーションがどのようにどのような要件をどのように設計しているかに完全に依存します。 – gmiley

+0

これは 'object sender'を介して取得できます。それを非常によく説明している[この広範な答え](http://stackoverflow.com/a/4886417/594832)を見てください。 – khlr

+0

@khlrできません。イベントハンドラはContextMenuに添付され、送信者はContextMenuになります。 – Steve

答えて

1

のContextMenuはSourceControlと呼ばれる性質を持っており、MSDNはそれ

は、ショートカットメニューを表示しているコントロールを取得しますと言います。

だからあなたのイベントハンドラは、MenuItemのからのContextMenuに達する可能性があるが、このように送信者パラメータとして

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

実際にif文が何を確認しているのか説明できますか? ラベルを編集するだけです。ユーザーが右クリックしたラベルを編集します。基本的に、その特定のラベルのプロパティを変更します。 –

+0

'NullReferenceException'の防止 – gmiley

+0

これは習慣です。このコンテキストでは、おそらくすべてのオブジェクト参照はnullになることはありませんが、ヌルの単純なチェックを追加することは、怒っている顧客との電話の間違った終了時に使用する方法を学ぶ救い主です – Steve

関連する問題