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

このQ&Aのポイント
  • C#のWindows Applicationプロジェクトで、ボタン名を変更しても動く理由を教えてください。
  • C#のWindows Applicationプロジェクトでボタン名を変更する際に、自動的に関数名も変更されるのか教えてください。
  • Visual Studioを使ってC#のWindows Applicationプロジェクトを作成し、ボタン名の変更に関するデバッグの挙動について教えてください。
回答を見る
  • ベストアンサー

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は右も左もわからないレベルの人間です。何卒ご教授お願い致します。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

まぁ、既に回答されている通りイベントハンドラの名前と、オブジェクトの名前は別…だからですかね。 『デザイナでイベントハンドラを追加するときにオブジェクトの名前からハンドラ名が生成されるだけ』です。 Form1.Designer.csをコード表示すると、 this.BTN1.Click += new System.EventHandler(this.B1_Click); なんて行があるかと。 で、デザイナで対象の名前を変えると「this.BTN1.Click」の部分が変更され、ハンドラの名前には影響を受けません。 なので、戻り値の型と引数の型・個数が合えばハンドラとして登録も可能。ということになります。 似たような処理をするが対象が異なるだけ…という場合はハンドラを1つにまとめることも可能。ということになります。 private void button1_Click(object sender, EventArgs e) {  TextBox1.Text = "abcd"; } private void button2_Click(object sender, EventArgs e) {  TextBox2.Text = "abcd"; } private void button3_Click(object sender, EventArgs e) {  TextBox3.Text = "abcd"; } は private void button_Click(object sender, EventArgs e) {  TextBox Target = null;  switch(((Button)sender).Name)  {   case "button1":Target = TextBox1; break;   case "button2":Target = TextBox2; break;   case "button3":Target = TextBox3; break;  }  Target.Text = "abcd"; } にもまとめられる…ということになります。 # まぁ、こうするとオブジェクトの名前を気軽に変えるワケには行かなくなりますが。 # 変えた場合でも実行時エラーにならないし。 # TextBoxの方の名前を変えた場合にはコンパイルエラーになりますけど。

mellow91
質問者

お礼

なんというわかりやすいご説明!とてもよく理解でき、かつ勉強になりました!ありがとうございました!!

その他の回答 (2)

回答No.2

ボタンのプロパティ欄で、ボタンのイベント欄を確認すればわかることですが ボタンをClickしたときに実行する関数は、最初は空ですが、ダブルクリックした時にB1_Clickが登録されます。 その後は、たとえボタン名を変更してもClickしたときに実行する関数はB1_Clickのままです。 もし、その関数名を変更するとClickしたときに実行する関数が行方不明になってClickイベント欄は空になります。(変更した関数名を登録してやらないとClickイベントが実行されない)

mellow91
質問者

お礼

なんというわかりやすいご説明!とてもよく理解でき、かつ勉強になりました!ありがとうございました!!

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.1

手元に無いから、記憶だけで書くけど その「private void B1_Click・・・・・」の右側が大事 Handled by なんとかかんとかって記述があるでしょう? そっちはコントロール名の変更に追従して書き換えられているはず つまり見ているのは、関数名ではなくイベントの割り当て名とでも言うべき部分 関数名を勝手に変えるのはリスキー 作成者がもっと分かり易い意味のある関数名に書き換えている可能性もあるし 他のコード(命令行)で、その関数を呼んでいるかも知れない ソレなのに、勝手に書き換えてしまえばコードを壊してしまう結果になる

mellow91
質問者

お礼

なんというわかりやすいご説明!とてもよく理解でき、かつ勉強になりました!ありがとうございました!!

関連するQ&A

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

  • 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#での書き方

    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

  • Visual C#を用いたボタン押し処理について

    Visual C#を用いたボタン押し処理について Visual C#のWindowsアプリケーションについての質問です。 「ボタンA、ボタンB、ボタンC」ボタンを3つ作ります。 private void button1_Click(object sender, EventArgs e){} このようなソースになるのですが、ボタンAを押したときにボタンB、ボタンCを押した処理を行いたいです。ボタンB、Cを button2_Click(X,Y); button3_Click(X,Y); でロードするのはわかるのですが、XとYには何を入れればいいのでしょうか? 検索した結果、おそらくnullを入れてはいけないのはわかったのですが、何を入れればいいのかがわかりません。 >非静的イベントを発生させるときは、sender パラメーターとして null (Visual Basic の場合は Nothing) を渡さないでください。 よろしくお願いします。

  • C#プログラムにて

    C#プログラムにて お世話になります。 C#初心者です。 プログラムコードを書き始めで、早速行き 詰っています。 ステップでコードの動きを確認したところ、 program.csのMainから下記のForm1.csに 移りForm1のデザイナが表示されるのですが、 button3を押してもForm3が表れません。 また、ステップの黄色いカーソルと言いますか ステップの位置情報も消えています。 何がどう悪いのか分からなく困っています。 どなたかご親切な方、ご教授頂きたく 宜しくお願い致します。     記 using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { Form3 cForm3 = new Form3(); cForm3.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { DialogResult ans; ans = MessageBox.Show("最新のコード表を照会しますか?", "Microsoft Visual Studio", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (ans == DialogResult.OK) Application.Exit(); } private void button12_Click(object sender, EventArgs e) { Form4 cForm4 = new Form4(); cForm4.ShowDialog(); } } }

  • Visual studioのボタン処理について

    こんにちは。 C++(初心者)で大変迷っています。 Visual studio 2010のWindows フォームアプリケーションでボタンを作成し、Cppのmainで計算した計算結果を表示させる。という物を作りたいと思っています。 例:一秒ごとに数値が1上がっていくプログラムを作成したいと思っております。 現在、Form1にボタン(Button)と文字を表示させるラベル(Label)のみを作成。 そうしたら、Form1.hに…… Private:System::void button1_Click(System::Object^ sender,System::EventArgs^ e){ } Private:System::void lavel1_Click(System::Object^ sender,System::EventArgs^ e){ } の二つが生成されました。 Form1.hに直接MassegeShowなどを使い書けば文字程度は出力されるのですが、cppに書いてその結果を持ってくる方法が解りません。 どうやらポインタを使って行うらしいのですが、勉強中なのでどなたかご教授お願いします。 ※例でプログラムを示してくれると大変うれしいです。

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

    現在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# フォーム追加後、旧フォームを閉じたい

    前略 ・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を閉じる }    } } 以上

  • 他のFormのクリックイベント

    教えてください! 他のFormのクリックイベントを実行できますか? Form2のButton2をクリックした時に、Form1の「Button1_Click」を実行させることができますか? 出来るとしたら、Form2の「Button2_Click」にはどのように記載したらいいのでしょうか? [Form1]より Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)・・・ [Form2]より Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs)・・・ End Sub 宜しくお願いします。

専門家に質問してみよう