C# 2010 contextMenuStripのファンクション名の不思議?

このQ&Aのポイント
  • C# 2010 contextMenuStripを使用した際、試験3を途中に追加した場合のファンクション名が異なる理由について質問です。
  • 試験1と試験3の間に『試験3を途中に追加』を入れてダブルクリックして作ったファンクション名は前2者とは異なり (3)のような形になってしまいます。
  • なぜ試験2を途中に追加した場合には適切なファンクション名にならないのでしょうか?
回答を見る
  • ベストアンサー

C# 2010 contextMenuStripのファンクション名の不

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』だけにしても結果は同じでした

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

これは インスタンスの作成過程の違いによるものだと思いますよ 試験1、試験3については 作成時に名前の変更している 追加した試験2は オブジェクトを作成後に表示テキストを追加している といった違いだと思います 1)メニュー項目を追加する際のドロップダウン(コンボ)ボックスのドロップボタンを押してMenuItemを選択して追加を行います 2)その項目を選択してから一呼吸おいて もう一度クリックします 3)これで表示名テキストの編集モードになると思いますので ご希望の文字列に変更する この手順が 途中に追加する場合とよく似ているかと思います イベントハンドラの命名はオブジェクトの名前に依存しますので質問のような現象が起きると思います 追加の場合のポップアップの枝葉のMenuItemにもうひとつオブジェクトの名前入力などのオプションがあれば『試験2を途中に追加』といったオブジェクト名もつけられるでしょう ですが、この操作が冗長であるのではないかとMicrosoftが判断したのかもしれません 漢字名のオブジェクトを作りたいのであれば 試験1、試験3と同様の手順で『試験2を途中に追加』を作成しておいて D&Dで順序を入れ替えるほうが現実的かもしれませんよ 私なら 必要な項目数分MenuItemを追加してしまってから Nameプロパティでオブジェクト名を本来設定したい内容に変更するといった手順を取ると思います ハンドラの生成はこの変更を行ってからやりますね … 添付画像の『試験5を途中に追加』は 左側が新規項目を最下段で作成して 右側のようにD&Dで順序を入れ替えたものです このようにすれば漢字名のオブジェクト名で統一といった事も可能ですよ

sato-may
質問者

お礼

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

その他の回答 (1)

回答No.2

 Clickイベントハンドラの名前はTextプロパティの値を付けているのではなく、ToolStripMenuItemのオブジェクトの名前(プロパティウインドウのNameの値)を用いて付けられてるからです。  通常、ContextMenuStripコントロールの上でToolStripMenuItemを追加するときは、メニューの一番下のコントロールの上でブランクになってるところにメニュー項目の名前を記入しますよね。  この入力中の時点ではまたToolStripMenuItemのオブジェクトは追加されていません。メニュー項目の名前の記入が終わってエンターを押すなり、コントロールのフォーカスを変えるなりした時点でオブジェクトが作成されます。この時、項目の名前として入力されたテキストがTextプロパティに設定されると共に、それを用いて「項目名ToolStripMenuItem」というオブジェクト名が付けられます。  したがって、このメニュー項目をクリックした時に生成されるClickイベントハンドラには「項目名ToolStripMenuItem_Click」という名前が付けられます。  一方、メニューの途中にToolStripMenuItemを挿入した場合は、その時点でオブジェクトが生成され、暫定的なオブジェクト名とTextプロパティの値が付けられます。それが「toolStripMenuItem1」とかいうものです。  このContextMenuStripコントロールの上のメニュー項目の名前を変更しても、それはTextプロパティを変更することにしかならないので、ToolStripMenuItemのオブジェクト名は変更されません。よって、このメニュー項目をクリックした時に生成されるClickイベントハンドラにはオブジェクト名を用いて「toolStripMenuItem1_Click」という名前が付けられます。  後者のイベントハンドラの名前を前者と同様に揃えたいのであれば、イベントハンドラを生成する前にプロパティウインドでToolStripMenuItemのオブジェクト名を変更しておく必要があります。あるいはイベントハンドラの生成をコントロール上のクリックで行うのではなく、プロパティウインドウ上で名前を直接付けて生成するかです。  もちろん、後からイベントハンドラの名前を変更することも出来ますが、変更点が多くなります。

sato-may
質問者

お礼

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

関連するQ&A

  • VS C# のコンテキストの動作について

    VS C# のコンテキストの動作がうまくいきません、助けてください>< List Viewのアイテムを右クリックしたときに「アイテム名を表示させる」というコンテキストを表示し、それをクリックするとアイテム名を表示させるというプログラムを組んだのですが、一度目はうまく動作するのですが、その後、List Viewのアイテムのない場所を右クリックしてもコンテキストが表示されてしまいます。 何が原因なんでしょうか? 教えてください、お願いします。 以下コード 前略 private void ListView_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { ConTextMenu(); } } private void ConTextMenu() { ContextMenuStrip cms = new ContextMenuStrip(); ToolStripMenuItem menu1 = new ToolStripMenuItem(); menu1.Text = "アイテム名を表示させる"; cms.Items.AddRange(new ToolStripMenuItem[] { menu1} ); menu1.Click += new EventHandler(menu_Click); this.ContextMenuStrip = cms; } private void menu_Click(object sender, EventArgs e) { string msg = sender.ToString(); if (msg == "アイテム名を表示させる") { ListViewItem item1 = new ListViewItem(); item1 = songlist.SelectedItems[0]; iname = item1.SubItems[0].Text; MessageBox.show(iname.Tostring()); }

  • C# 2010 PrintPreviewDialogからの印刷でバルー

    C# 2010 PrintPreviewDialogからの印刷でバルーンを表示する方法? ContextMenuStripを作り、上に『印刷』下には『印刷プレビュー』としました 印刷を選択するとnotifyIconにバルーンを表示するようにしました ところでPrintPreviewDialogには印刷釦があります この印刷釦を押下した時にも同様にバルーンを表示するには、如何なる方法があるのでしょうか? 全く見当も着きません、教えてください、お願いします!!! private void 印刷ToolStripMenuItem_Click(object sender, EventArgs e) { BalloonShow(); //notifyIconにバルーンを表示; this.printDocument1.Print(); } private void 印刷プレビューToolStripMenuItem_Click(object sender, EventArgs e) { PrintPreviewDialog ObjectPrintPreviewDialog = new PrintPreviewDialog(); ObjectPrintPreviewDialog.Document = this.printDocument1; ObjectPrintPreviewDialog.ShowDialog(); } private void BalloonShow() //バルーンを表示 { notifyIcon1.BalloonTipText = "どうしたらバルーンが出ますか?"; }

  • C#でボタン名を変更しても動く

    Visual Studio2010 Expを動かして、C#のWindows Applicationプロジェクトを作成しました。 フォーム、F_1にボタンB1を配置しました。B1をダブルクリックすると、 Form1.csに下記のように追加されました。 private void B1_Click(object sender, EventArgs e) 次に、B1をBTN1に変更しました。 private void B1_Click(object sender, EventArgs e)は変更されていないにも関わらずデバック実行が通ってしまいました。 質問1.なぜデバックの実行が通ってしまったのでしょうか? 質問2.自動でprivate boid BTN1_Clickに変更にはならないのでしょうか? Visual Studioは右も左もわからないレベルの人間です。何卒ご教授お願い致します。

  • ToolStripMenuItemのクリックイベントからTreeViewのノードを取得したい

    C#3.5を使用しています。 TreeViewのContestMenuStripのToolStripMenuItemをクリックしたときに どの(複数のノードに同じContestMenuStripをセットしています)TreeViewのノードからのToolStripMenuItemが クリックされたかを知るためにEventArgs e からTreeViewの選択されてるノードが取得したいのですが、 どうすれば良いのでしょうか? private void itemAddToolStripMenuItem_Click(object sender, EventArgs e) { var ev = (System.Windows.Forms.ToolStripItemEventArgs)e;// ToolStripItemEventArgsにキャストすればよいかと思ったのですがエラーになります・・・ }

  • C#での書き方

    vb.netでは別のイベントを呼び出すとき下記のような書き方ができたのですが、C#ではどう書くんでしょうか? (ボタン2を押したらボタン1の処理が走る) Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MessageBox.Show("AAA") End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Button1_Click(sender, e) End Sub

  • イベントハンドラ関数について

    現在VC++/CLR 2005 でプログラミングをしています。 基本的な事柄かもしれませんが、質問させてください  以下の2つのボタンのイベントハンドラ関数があった場合 //ボタン1のイベントハンドラ関数 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { } ボタン2をクリックしたときの動作とボタン1の動作を同じにしたいと思っています。 その場合は private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { String^ str = textBox1->Text } のようにボタン2のイベントハンドラ関数をボタン1と同じように書けばいいのですが イベントハンドラ関数の処理が膨大になった場合を考えて省略する 書き方は無いのでしょうか?(以下の場合ですとエラーが起こってしまいます。) private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { button1_Click(); } 宜しくお願いします

  • c# イベントハンドラ 統一

    trackBarを複数配置しているのですが、そのtrackBarごとに private void trackBar1_Scroll(object sender, EventArgs e) { previewcolor(this.trackBar1.Value,'赤'); } private void trackBar2_Scroll(object sender, EventArgs e) { previewcolor(this.trackBar1.Value, '青'); } private void trackBar3_Scroll(object sender, EventArgs e) { previewcolor(this.trackBar1.Value, '緑'); } private void trackBar4_Scroll(object sender, EventArgs e) { previewcolor(this.trackBar1.Value, '透'); } こんな風に別々に記述する形になって非常にスッキリしないです。 これをジェネリクス?やデリゲート?などを使ってすっきりできないのでしょうか? visual stdio c# 2008を使ってます。 宜しくお願いします。

  • C# フォーム追加後、旧フォームを閉じたい

    前略 ・C#で教えてください。 ・Form1 からshowDiag()メソッドでForm2をつくります。Form2が表示されたら非アクティブとなったForm1を閉じたいのですが どのようにしたらよいのかおしえてください。  下記は、Close() メソッドで Form2側から閉じようとしたプログラムですがFrom1を閉じることができません。 よろしくお願いします。 //----------------------------------------------- namespace formClose { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.ShowDialog(); } }   public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { Form1 form1 = new Form1(); form1.Close(); //Form1が閉じない!! } private void button1_Click(object sender, EventArgs e) { this.Close(); //Form2を閉じる }    } } 以上

  • VS2005 ボタンを自動クリック

    VS2005の初心者です。 ボタンを自動的にクリックするロジックがわかりません。 現在は以下のようになっています。 private void Form1_Load(object sender, EventArgs e) {   (本文) } private void btnSendMail_Click(object sender, EventArgs e) {   (本文) } 今は、Form1_Loadが実行して、ボタンを押すとbtnSendMail_Clickが実行します。 これを、Form1_Loadの中でbtnSendMail_Clickを実行したいのです。 初心者なのでわかりにくいと思いますが、宜しくお願いします。

  • C#について・・・

    次のようなブログラムなのですが、ラジオボタンが上手く切り替わりません。 どこを修正すると上手くいくでしょうか? <<文字数オーバーのため省略>> public Form1() { // // Windows フォーム デザイナ サポートに必要です。 // InitializeComponent(); if(isJapanStyle) { label5.Text=string.Format("0時0分0秒"); label6.Text=string.Format("0時0分0秒"); } else { label5.Text=string.Format("00:00:00"); label6.Text=string.Format("00:00:00"); } // // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。 // <<文字数オーバーのため 省略>> static void Main() { Application.Run(new Form1()); } protected void button1_Click(object sender, System.EventArgs e) { if(isJapanStyle) { label5.Text=string.Format("{0}時{1}分{2}秒",dt.Hour,dt.Minute,dt.Second); } else { label5.Text=DateTime.Now.ToString("T"); } recTime=dt; timer2.Stop(); timer3.Start(); } private void button2_Click(object sender, System.EventArgs e) { Application.Exit(); } private void timer1_Tick(object sender, System.EventArgs e) { dt=DateTime.Now; if(isJapanStyle) { label4.Text=string.Format("{0}時{1}分{2}秒",dt.Hour,dt.Minute,dt.Second); } else { label4.Text=DateTime.Now.ToString("T"); } } private void timer3_Tick(object sender, System.EventArgs e) { keika=dt-recTime; if(isJapanStyle) { label6.Text=string.Format("{0}時間{1}分{2}秒",keika.Hours,keika.Minutes,keika.Seconds); } else { label6.Text=string.Format("{0}:{1}:{2}",keika.Hours,keika.Minutes,keika.Seconds); } } private void timer2_Tick(object sender, System.EventArgs e) { timer3.Stop(); } private void radioButton2_CheckedChanged(object sender, System.EventArgs e) { isJapanStyle=false; } private void radioButton1_CheckedChanged(object sender, System.EventArgs e) { isJapanStyle=true; } } }

専門家に質問してみよう