DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メニューアイテムの識別について

環境/言語:[C#]
分類:[.NET]

いつも参考にさせていただいています。

メニューアイテムのクリックイベントを共通のメソッドで処理したい
と思っています。
現在、各メニューアイテムを識別する方法として、Textプロパティを
参照しています。

private void menuItem_Click(object sender, System.EventArgs e)
{
switch (((MenuItem)sender).Text)
case "A":





ただしこの方法だと、Textを変えるたびにメンテナンスが発生してしま
うため、できれば他の方法がないかと悩んでいます。
他によい方法がおわかりの方、ご教授いただけないでしょうか。
よろしくお願いいたします。
2004/08/15(Sun) 00:45:49 編集(投稿者)

■No5550に返信(ぱるさんの記事)
> いつも参考にさせていただいています。
>
> メニューアイテムのクリックイベントを共通のメソッドで処理したい
> と思っています。
> 現在、各メニューアイテムを識別する方法として、Textプロパティを
> 参照しています。
>
> private void menuItem_Click(object sender, System.EventArgs e)
> {
> switch (((MenuItem)sender).Text)
> case "A":
> :
> :
> :
>
>
> ただしこの方法だと、Textを変えるたびにメンテナンスが発生してしま
> うため、できれば他の方法がないかと悩んでいます。
> 他によい方法がおわかりの方、ご教授いただけないでしょうか。
> よろしくお願いいたします。

ぱるさん、こんばんは。
メニューの階層を配列化し、その配列化されたメニューにイベントを追加させる事でイベントの共有ができますよ。

VB.NETで良ければ、私のサイトに「メニューの内部配列」がありますので、参考になると思います。C#版は忙しいので作る時間がありませんが、時間が取れ次第アップします。
■No5550に返信(ぱるさんの記事)
素直にsenderで識別してはダメなのですか?
senderってそのための引数だと思うのですが。
■No5574に返信(CRTさんの記事)
> ■No5550に返信(ぱるさんの記事)
> 素直にsenderで識別してはダメなのですか?
> senderってそのための引数だと思うのですが。

CRTさん、おはようございます。
実は、MenuItemにNameプロパティが無いのです。その為、ぱるさんは、.Textで識別しようとしていたと思われます。

私も自分のサイトの掲示板に「サンプルを作ってください」と書き込まれるまで、senderを使い、Nameプロパティで選別できると思っていたので、メニューの配列化なんて簡単にできると思っていた訳です。
■No5577に返信(ぺがらぼさんの記事)
> 実は、MenuItemにNameプロパティが無いのです。その為、ぱるさんは、.Textで識別しようとしていたと思われます。

いえ、MSDNによれば、== 演算子に関して『string 以外の参照型の場合、
== では 2 つのオペランドが同じオブジェクトを参照する場合に true が返されます。』
とのこと。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/csref/html/vclrfequalityoperator.asp

そして、senderはイベントの発生源のオブジェクトへの参照なのですから、
たとえば次のようにすればイベントの発生源の識別ができると思います。

    private void menuItems_Click(object sender, System.EventArgs e) {
        if (sender  == menuItem1){
            Console.WriteLine("menuItem1 Clicked !");
        }else if (sender == menuItem2){
            Console.WriteLine("menuItem2 Clicked !");
        }else if (sender == menuItem3){
            Console.WriteLine("menuItem3 Clicked !");
        }else if (sender == menuItem4){
            Console.WriteLine("menuItem4 Clicked !");
        }
    }

私はC#のコード書いたことがないので(汗、頓珍漢だったらすみません。
■No5579に返信(CRTさんの記事)
> ■No5577に返信(ぺがらぼさんの記事)
>>実は、MenuItemにNameプロパティが無いのです。その為、ぱるさんは、.Textで識別しようとしていたと思われます。
>
> いえ、MSDNによれば、== 演算子に関して『string 以外の参照型の場合、
> == では 2 つのオペランドが同じオブジェクトを参照する場合に true が返されます。』
> とのこと。
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/csref/html/vclrfequalityoperator.asp
>
> そして、senderはイベントの発生源のオブジェクトへの参照なのですから、
> たとえば次のようにすればイベントの発生源の識別ができると思います。
>
> private void menuItems_Click(object sender, System.EventArgs e) {
> if (sender == menuItem1){
> Console.WriteLine("menuItem1 Clicked !");
> }else if (sender == menuItem2){
> Console.WriteLine("menuItem2 Clicked !");
> }else if (sender == menuItem3){
> Console.WriteLine("menuItem3 Clicked !");
> }else if (sender == menuItem4){
> Console.WriteLine("menuItem4 Clicked !");
> }
> }
>
> 私はC#のコード書いたことがないので(汗、頓珍漢だったらすみません。

ぬお〜〜〜!本当だ〜〜〜!正直、スマンかった。いえ、すいません。^^;
よって、メニューアイテムの識別については、配列化する必要が無いので忘れてください。ただ、配列にする場合は、senderは関係ないので、掲載内容を変更する必要は無さそうです…

お詫びにVB.NETで実験したコードを記述しておきます。
Private Sub menuItems_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles menuItem1.Click, MenuItem2.Click, menuItem3.Click, menuItem4.Click
  If (sender Is menuItem1) Then
    Console.WriteLine("menuItem1 Clicked !")
  ElseIf (sender Is MenuItem2) Then
    Console.WriteLine("menuItem2 Clicked !")
  ElseIf (sender Is menuItem3) Then
    Console.WriteLine("menuItem3 Clicked !")
  ElseIf (sender Is menuItem4) Then
    Console.WriteLine("menuItem4 Clicked !")
  End If
End Sub
ぺがらぼさん、CRTさん
ご回答ありがとうございました。

ほんとは Nameや Tagのプロパティが使えればよかったのですが
教えてもらった方法で対処したいと思います。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板