フォーム上のコントロールを切り貼りすると、それまでそれぞれのコントロールに割り当てていたイベントが発生しなくなります。なぜでしょうか?
フォーム上で一旦配置をしたコントロールを同じフォーム上のタブの上とかフレームなどの上に配置変更をしたいことがありますが、切り貼りを使うとどうしてもイベントが発生しなくなってしまい困っています。
一応調べる努力はしたのですが解決できませんでした。何かご存知の方がおられればご教授願いたいと思います。
【調査内容】
簡易的にFormにコマンドボタンを1つ配置し、そのコマンドにClick時にメッセージボックスを出力するようにしました。切り取って再度貼り付ける前は問題なくイベントが発生しメッセージボックスが出るのですが、一度切り取って貼り付けるとイベントが発生しなくなってしまいます。
<コード>
⇒上がうまくいくときのコード
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox("クリック")
End Sub
⇒ダメな時のコード
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
MsgBox("クリック")
End Sub
見てみるとイベントハンドラ(Handles Button1.Click)がなくなっています。これが原因だと思うのですが、なぜなくなったかが分かりません。
.NETの設定によるのでしょうか?
ちなみにドットネットのVer情報(ヘルプのバージョン情報)は
Microsoft Develop Enviroment 2002 Ver7.0.9486
です。
>見てみるとイベントハンドラ(Handles Button1.Click)がなくなっています。
>これが原因だと思うのですが、なぜなくなったかが分かりません。
切り取ったからでしょう?…他には
#Region " Windows フォーム デザイナで生成されたコード "
〜
#Region
で折りたたまれている部分の初期化用のコードとかも自動で削除されます。
> ⇒ダメな時のコード
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
プロシージャ名の Button1_Click とボタンのクリックイベントとは
何の関係もありません。自動でコードを書かせた時にデフォルトで
そういった名前が付けられるだけです。引数さえ同じであれば
Private Sub AAA(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
でも動きます。
Private Sub AAA(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
の様に複数のイベントを結びつける事も可能です。
Button1_Click という名前のタダの関数になってますので Handles 句を追加して
イベントと結び付けてあげて下さい。
特攻隊長まるるうさんご解答ありがとうございます。
もう一つ、ご存知の方がおられればご教授願いたいのですが
>フォーム上で一旦配置をしたコントロールを同じフォーム上のタブの
>上とかフレームなどの上に配置変更をしたいことがありますが、切り
>貼りを使うとどうしてもイベントが発生しなくなってしまい困っています。
の部分について、一旦イベントを割り当てたコントロールをイベントを割り当てたそのまま状態で別に配置換えする事は出来ないのでしょうか?
特に同一フォームでない場合の場合はコントロールの配置換えをする場合は切り取りをするしかないと思っているのですが、何かいい方法はあるのでしょうか?
いやだから、特攻隊長まるるうさんの説明をもう一度よく読んで。
解からなかったらここも読んでね。
http://www.atmarkit.co.jp/fdotnet/vb6tonet2/vbnet2_12/vbnet2_12_01.html
それでも解からなかったら、解からない部分を質問いてね。
>我龍院忠太さん
ありがと。でも、デザイン画面でオブジェクトの移動に関しては
コメントしてないよ。(^^;)
TabControl と GroupBox に関しては同一フォームではドラッグ
&ドロップで乗る事を確認しました。
>特に同一フォームでない場合の場合は
その状態は、移動先のフォームにそもそもイベントハンドラが
書かれてないはずです。コントロールの名称もデフォルトに
なりますし、イベントハンドラも変化してしまいます。もともと
違うオブジェクトにコードを自動で引き継ぐのは危険な行為でしょう。
同じ変数や関数が書かれていた場合を考えてみて下さい。上書き
します?ぐちゃぐちゃになりそうでしょ?
…という事で、我龍院忠太さんもこれが言いたかったんだと思いますが、
1つ1つ確認しながら地道に
>Button1_Click という名前のタダの関数になってますので Handles 句を追加して
>イベントと結び付けてあげて下さい。
を繰り返すのが王道です。
コードを参考にしたいなら切り取らずにコピーしてコードもコピーして
みるとか?文字列の検索と置換でオブジェクト名を置き換える操作
と組み合わせれば手間ではないでしょう?
特攻隊長まるるうさん、我龍院忠太さんご返答ありがとうございました。
適切なご回答感謝いたします。
今後作業する上で参考にさせていただきます。
今後も別の質問を出すことになると思いますが、その際はまたよろしくお願いします。
ツイート | ![]() |