C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.86192 の関連記事表示

<< 0 >>
■86192  Re[9]: DateTimePickerでのクリックイベント
□投稿者/ 魔界の仮面弁士 -(2017/12/23(Sat) 08:55:45)
    2017/12/23(Sat) 14:25:13 編集(投稿者)

    No86186 (ちょこじー さん) に返信
    > 自分では明示的にアタッチ文を書いていないので、デフォルトの設定で入っていたのでしょうか・・・?

    DateTimePicker1_Enter などといったイベントハンドラーをアタッチする場合、
    C# の場合はオブジェクトに対してイベントハンドラを += で割り当てる言語仕様ですが、
    VB の場合は逆で、イベントハンドラに対してオブジェクトを割り当てる言語仕様です。


    具体的には、Visual Basic の場合

      Private Sub DateTimePicker1_Enter(sender As Object, _
         e As EventArgs) Handles DateTimePicker1.Enter

    のように、末尾に『Handles 対象オブジェクト.イベント名』の宣言があり、
    これによってイベントのアタッチが行われるということです。

    この Handles 句による割り当ては、Visual Studio によって自動的に行われます。


    また、たとえばこれを、『Handles DateTimePicker1.Enter, DateTimePicker2.Enter』とすれば
    DatePicker1 と DatePicker2 の両方のイベントを一か所にまとめることさえできます。

    引数の型に互換性があれば、異なる種類のコントロールやイベントをまとめることもできますので
     Sub Hoge(sender As Object, e As EventArgs) Handles Button1.Click, TextBox1.TextChanged
    などといったことさえ可能です。


    もし、イベント処理を使う必要がなくなった場合は、この Sub 〜 End Sub の処理を
    Handles 句も含めて丸ごと削除すれば、イベントの割り当ても自動解除されます。


    これが C# だと、割り当てや解除を += や -= という演算子で行う言語仕様になっています。
    フォームデザイナーからだと、Form1.Desinger.cs ファイル内に自動的に
      DateTimePicker1.Enter += DateTimePicker1_Enter;
    に相当するコードが記載されることになります。
    左辺の「オブジェクト.イベント」に対して、右辺の「イベントハンドラ」が割り当てられます。


    それゆえ C# の場合、void DateTimePicker1_Enter(…) の処理が不要になったからと言って、
    不要になったイベントハンドラを不用意に削除してしまうと、.Designer.cs 側での
    アタッチコードが残ってしまい、「DateTimePicker1_Enter が見つからない!」ということで
    不整合を起こしてエラーになってしまうのですが、VB ではその心配が無いですね。


    ちなみに VB で Handles 句を使うためには、その変数が
      Friend WithEvents DateTimePicker1 As DateTimePicker
    のように、「WithEvents 句」付きで宣言されている必要があるのですが、
    フォームにコントロールを張り付けた場合、自動的に WithEvents 句付きの宣言が
    Form1.Desinger.vb ファイル内に自動生成されるので、普段は意識する必要がありません。



    一方、WebSurfer さんが書かれた AddHandler ステートメントですが、これが必要になるのは
    イベントの割り当てをフォームデザイナーによる自動割り当てに任せることなく、
    プログラムから明示的に、アタッチ操作を行いたい場合に限定されます。
    なので、AddHandler + AddressOf が必要になるのは、やや特殊なケースですね。
    (ちなみにでデタッチは RemoveHandler ステートメントです)


    ただし、デザイン時専用プロパティである「GenerateMember プロパティ」を
    True から False に変更していた場合には、Visual Basic (の 2005 以降) は
    WithEvents + Handles による標準的な割り当ての代わりに、
    AddHandler + AddressOf による割り当てを Form1.designer.vb に記述するようになっています。
記事No.86178 のレス /過去ログ147より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -