• ベストアンサー
  • 暇なときにでも

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

  • 質問No.7924027
  • 閲覧数2409
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 31% (1506/4719)

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

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

  • 回答No.3
  • ベストアンサー

ベストアンサー率 53% (2177/4070)

まぁ、既に回答されている通りイベントハンドラの名前と、オブジェクトの名前は別…だからですかね。
『デザイナでイベントハンドラを追加するときにオブジェクトの名前からハンドラ名が生成されるだけ』です。

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

お礼率 31% (1506/4719)

なんというわかりやすいご説明!とてもよく理解でき、かつ勉強になりました!ありがとうございました!!
投稿日時:2013/02/06 10:37

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 44% (364/816)

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

お礼率 31% (1506/4719)

なんというわかりやすいご説明!とてもよく理解でき、かつ勉強になりました!ありがとうございました!!
投稿日時:2013/02/06 10:37
  • 回答No.1

ベストアンサー率 22% (2662/11921)

手元に無いから、記憶だけで書くけど

その「private void B1_Click・・・・・」の右側が大事

Handled by なんとかかんとかって記述があるでしょう?

そっちはコントロール名の変更に追従して書き換えられているはず

つまり見ているのは、関数名ではなくイベントの割り当て名とでも言うべき部分

関数名を勝手に変えるのはリスキー
作成者がもっと分かり易い意味のある関数名に書き換えている可能性もあるし
他のコード(命令行)で、その関数を呼んでいるかも知れない
ソレなのに、勝手に書き換えてしまえばコードを壊してしまう結果になる
お礼コメント
mellow91

お礼率 31% (1506/4719)

なんというわかりやすいご説明!とてもよく理解でき、かつ勉強になりました!ありがとうございました!!
投稿日時:2013/02/06 10:37
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ