アプリ版:「スタンプのみでお礼する」機能のリリースについて

C# 2010 contextMenuStripのファンクション名の不思議?
まず2ケのメニューアイテムを持つcontextMenuStripを作り、それぞれのTEXTを試験1、試験3と改名します
ダブルクリックするとハンドラーが出来て、その名称が(1)(2)のように TEXT名+ToolStripMenuItem_Click なります
ここでいったんプロジェクトを終了して再ロードします
画像のように試験1と試験3の間に『試験3を途中に追加』を入れてダブルクリックして作ったファンクション名は前2者とは異なり (3)の如くtoolStripMenuItem1_Click となってしまいます
なぜ 試験2を途中に追加ToolStripMenuItem_Click にならないのでしょうか?
private void 試験1ToolStripMenuItem_Click(object sender, EventArgs e) --- (1)
{ }
private void 試験3ToolStripMenuItem_Click(object sender, EventArgs e) --- (2)
{ }
private void toolStripMenuItem1_Click(object sender, EventArgs e) --- (3)
{ }
追伸 『試験3を途中に追加』が長すぎるかと思い、『試験3』だけにしても結果は同じでした

「C# 2010 contextMenuS」の質問画像

A 回答 (2件)

これは インスタンスの作成過程の違いによるものだと思いますよ



試験1、試験3については 作成時に名前の変更している
追加した試験2は オブジェクトを作成後に表示テキストを追加している
といった違いだと思います

1)メニュー項目を追加する際のドロップダウン(コンボ)ボックスのドロップボタンを押してMenuItemを選択して追加を行います
2)その項目を選択してから一呼吸おいて もう一度クリックします
3)これで表示名テキストの編集モードになると思いますので ご希望の文字列に変更する

この手順が 途中に追加する場合とよく似ているかと思います


イベントハンドラの命名はオブジェクトの名前に依存しますので質問のような現象が起きると思います

追加の場合のポップアップの枝葉のMenuItemにもうひとつオブジェクトの名前入力などのオプションがあれば『試験2を途中に追加』といったオブジェクト名もつけられるでしょう
ですが、この操作が冗長であるのではないかとMicrosoftが判断したのかもしれません


漢字名のオブジェクトを作りたいのであれば 試験1、試験3と同様の手順で『試験2を途中に追加』を作成しておいて
D&Dで順序を入れ替えるほうが現実的かもしれませんよ

私なら 必要な項目数分MenuItemを追加してしまってから Nameプロパティでオブジェクト名を本来設定したい内容に変更するといった手順を取ると思います
ハンドラの生成はこの変更を行ってからやりますね …

添付画像の『試験5を途中に追加』は 左側が新規項目を最下段で作成して 右側のようにD&Dで順序を入れ替えたものです
このようにすれば漢字名のオブジェクト名で統一といった事も可能ですよ
「C# 2010 contextMenuS」の回答画像1
    • good
    • 0
この回答へのお礼

分り易いご回答ありがとうございました
間違った理由も理解できました
方法論としては
【添付画像の『試験5を途中に追加』は 左側が新規項目を最下段で作成して 右側のようにD&Dで順序を入れ替えたものです】
が一番簡単でしたのでトライしたら一発OKでした
今後も宜しくご指導をお願い申し上げます
ありがとうございました

お礼日時:2010/10/08 06:20

 Clickイベントハンドラの名前はTextプロパティの値を付けているのではなく、ToolStripMenuItemのオブジェクトの名前(プロパティウインドウのNameの値)を用いて付けられてるからです。



 通常、ContextMenuStripコントロールの上でToolStripMenuItemを追加するときは、メニューの一番下のコントロールの上でブランクになってるところにメニュー項目の名前を記入しますよね。
 この入力中の時点ではまたToolStripMenuItemのオブジェクトは追加されていません。メニュー項目の名前の記入が終わってエンターを押すなり、コントロールのフォーカスを変えるなりした時点でオブジェクトが作成されます。この時、項目の名前として入力されたテキストがTextプロパティに設定されると共に、それを用いて「項目名ToolStripMenuItem」というオブジェクト名が付けられます。
 したがって、このメニュー項目をクリックした時に生成されるClickイベントハンドラには「項目名ToolStripMenuItem_Click」という名前が付けられます。

 一方、メニューの途中にToolStripMenuItemを挿入した場合は、その時点でオブジェクトが生成され、暫定的なオブジェクト名とTextプロパティの値が付けられます。それが「toolStripMenuItem1」とかいうものです。
 このContextMenuStripコントロールの上のメニュー項目の名前を変更しても、それはTextプロパティを変更することにしかならないので、ToolStripMenuItemのオブジェクト名は変更されません。よって、このメニュー項目をクリックした時に生成されるClickイベントハンドラにはオブジェクト名を用いて「toolStripMenuItem1_Click」という名前が付けられます。

 後者のイベントハンドラの名前を前者と同様に揃えたいのであれば、イベントハンドラを生成する前にプロパティウインドでToolStripMenuItemのオブジェクト名を変更しておく必要があります。あるいはイベントハンドラの生成をコントロール上のクリックで行うのではなく、プロパティウインドウ上で名前を直接付けて生成するかです。
 もちろん、後からイベントハンドラの名前を変更することも出来ますが、変更点が多くなります。
    • good
    • 0
この回答へのお礼

『後者のイベントハンドラの名前を前者と同様に揃えたいのであれば、イベントハンドラを生成する前にプロパティウインドでToolStripMenuItemのオブジェクト名を変更しておく必要があります。あるいはイベントハンドラの生成をコントロール上のクリックで行うのではなく、プロパティウインドウ上で名前を直接付けて生成するかです。』
早速この方法でテストしてみました
結果は良好でした
ありがとうございます
この方法は極めて正当法であり、ロジック的にも説明力が高いと思います
回答者さまの技術の実力が偲ばれます
今後もお世話になります、ありがとうございました

お礼日時:2010/10/08 06:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!