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

わんくま同盟

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

C# と VB.NET の入門サイト

ツリー一括表示

DateTimePickerでのクリックイベント /ちょこじー (17/12/22(Fri) 18:24) #86178
Re[1]: DateTimePickerでのクリックイベント /WebSurfer (17/12/22(Fri) 19:17) #86179
  └ Re[2]: DateTimePickerでのクリックイベント /ちょこじー (17/12/22(Fri) 19:27) #86180
    └ Re[3]: DateTimePickerでのクリックイベント /WebSurfer (17/12/22(Fri) 20:22) #86181
      └ Re[4]: DateTimePickerでのクリックイベント /ちょこじー (17/12/22(Fri) 21:48) #86182
        └ Re[5]: DateTimePickerでのクリックイベント /WebSurfer (17/12/22(Fri) 22:16) #86183
          └ Re[6]: DateTimePickerでのクリックイベント /ちょこじー (17/12/22(Fri) 22:30) #86184
            └ Re[7]: DateTimePickerでのクリックイベント /WebSurfer (17/12/22(Fri) 22:58) #86185
              └ Re[8]: DateTimePickerでのクリックイベント /ちょこじー (17/12/22(Fri) 23:08) #86186
                ├ Re[9]: DateTimePickerでのクリックイベント /Hongliang (17/12/22(Fri) 23:41) #86189
                ├ Re[9]: DateTimePickerでのクリックイベント /WebSurfer (17/12/22(Fri) 23:30) #86187
                │└ Re[10]: DateTimePickerでのクリックイベント /ちょこじー (17/12/22(Fri) 23:34) #86188
                │  └ Re[11]: DateTimePickerでのクリックイベント /WebSurfer (17/12/23(Sat) 10:37) #86193
                └ Re[9]: DateTimePickerでのクリックイベント /魔界の仮面弁士 (17/12/23(Sat) 08:55) #86192
                  └ Re[10]: DateTimePickerでのクリックイベント /ちょこじー (17/12/25(Mon) 13:22) #86205 解決済み


親記事 / ▼[ 86179 ]
■86178 / 親階層)  DateTimePickerでのクリックイベント
□投稿者/ ちょこじー (1回)-(2017/12/22(Fri) 18:24:52)

分類:[.NET 全般] 

DateTimePickerをクリックした時に、
最大日時に現在日時を設定したいのですが
Private Sub DateTimePicker1_Click(sender As Object, e As EventArgs) Handles DateTimePicker1.MouseClick

DateTimePicker1.MaxDate = Now

End Sub



Private Sub DateTimePicker1_Click(sender As Object, e As EventArgs) Handles DateTimePicker1.Click

DateTimePicker1.MaxDate = Now

End Sub

とやっても設定されません。

どうすればクリックイベントを拾えますか?
 




[ □ Tree ] 返信 編集キー/

▲[ 86178 ] / ▼[ 86180 ]
■86179 / 1階層)  Re[1]: DateTimePickerでのクリックイベント
□投稿者/ WebSurfer (1405回)-(2017/12/22(Fri) 19:17:06)
No86178 (ちょこじー さん) に返信

何を作っているのかと(Windows Forms? ASP.NET Web Forms? WPF? その他?)、あなたの
開発環境ぐらいは書きませんか?
[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86179 ] / ▼[ 86181 ]
■86180 / 2階層)  Re[2]: DateTimePickerでのクリックイベント
□投稿者/ ちょこじー (2回)-(2017/12/22(Fri) 19:27:25)
No86179 (WebSurfer さん) に返信
> ■No86178 (ちょこじー さん) に返信
>
VB.NET2015で
Windows Formsを作っています
よろしくお願いいたします。

[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86180 ] / ▼[ 86182 ]
■86181 / 3階層)  Re[3]: DateTimePickerでのクリックイベント
□投稿者/ WebSurfer (1406回)-(2017/12/22(Fri) 20:22:44)
No86180 (ちょこじー さん) に返信

Click イベントに代えて Enter イベントを利用してはいかがですか?

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.dateTimePicker1.Enter += DateTimePicker1_Enter;
        }

        private void DateTimePicker1_Enter(object sender, EventArgs e)
        {
            ((DateTimePicker)sender).MaxDate = DateTime.Now;
        }
        // ・・・中略・・・
    }
}

[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86181 ] / ▼[ 86183 ]
■86182 / 4階層)  Re[4]: DateTimePickerでのクリックイベント
□投稿者/ ちょこじー (3回)-(2017/12/22(Fri) 21:48:07)
ありがとうございます。

Enterコマンドでうまくいきました。

ちなみに
this.dateTimePicker1.Enter += DateTimePicker1_Enter;
というのは何をやっているのでしょうか?

DateTimePicker1_Enter
の変数には何が入っていますか?
 
[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86182 ] / ▼[ 86184 ]
■86183 / 5階層)  Re[5]: DateTimePickerでのクリックイベント
□投稿者/ WebSurfer (1407回)-(2017/12/22(Fri) 22:16:11)
No86182 (ちょこじー さん) に返信

> this.dateTimePicker1.Enter += DateTimePicker1_Enter;
> というのは何をやっているのでしょうか?

dateTimePicker1 の Enter イベントに、イベントハンドラ DateTimePicker1_Enter を
アタッチしています。

VB.NET では以下のようになるかと思います。(自信なし)

AddHandler Me.dateTimePicker1.Enter, AddressOf DateTimePicker1_Enter


> DateTimePicker1_Enter の変数には何が入っていますか?

変数というよりはメソッド(イベントハンドラ)のアドレスです。

イベントについて、その概略説明は以下の記事を見てください。

イベントハンドラ
http://surferonwww.info/BlogEngine/post/2012/07/02/declaration-of-event-and-handler.aspx

VB.NET で説明しろと言うことであれば、別に新たにスレッドを立てて聞いてください。
[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86183 ] / ▼[ 86185 ]
■86184 / 6階層)  Re[6]: DateTimePickerでのクリックイベント
□投稿者/ ちょこじー (5回)-(2017/12/22(Fri) 22:30:03)
No86183 (WebSurfer さん) に返信

ありがとうございます。
なぜか分かりませんが、
AddHandler Me.dateTimePicker1.Enter, AddressOf DateTimePicker1_Enter

というようなものを書かずとも
enterイベントからクリックイベント拾うことができました。

そもそもクリックイベントが使えないのはなぜなのでしょうか?
 
[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86184 ] / ▼[ 86186 ]
■86185 / 7階層)  Re[7]: DateTimePickerでのクリックイベント
□投稿者/ WebSurfer (1408回)-(2017/12/22(Fri) 22:58:47)
No86184 (ちょこじー さん) に返信

> なぜか分かりませんが、
> AddHandler Me.dateTimePicker1.Enter, AddressOf DateTimePicker1_Enter
>
> というようなものを書かずとも
> enterイベントからクリックイベント拾うことができました。

それは質問者さんがどういうコードを書いているか知る由もない自分には分かりませんが、
少なくとも何らかの手段でハンドラをアタッチしなければ何ともならないのは確かです。

.Designer.vb 内でアタッチしているか、ハンドラの Handles DateTimePicker1.Enter と
かでやっているのでは?

> そもそもクリックイベントが使えないのはなぜなのでしょうか?

それは調べてませんので不明です。プロパティウィンドウには表示されない=使えない
と思って最初から考えてませんでした。
[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86185 ] / ▼[ 86189 ] ▼[ 86187 ] ▼[ 86192 ]
■86186 / 8階層)  Re[8]: DateTimePickerでのクリックイベント
□投稿者/ ちょこじー (6回)-(2017/12/22(Fri) 23:08:05)
No86185 (WebSurfer さん) に返信


自分では明示的にアタッチ文を書いていないので、デフォルトの設定で入っていたのでしょうか・・・?

確かにプロパティウインドウにクリックイベントは表示されていませんが、
それはテキストボックスなどでは表示されていないにも拘わらず
普通に使うことができます。
何を根拠にクリックイベントを使えるかどうか判断すれば良いですか?
 

[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86186 ] / 返信無し
■86189 / 9階層)  Re[9]: DateTimePickerでのクリックイベント
□投稿者/ Hongliang (590回)-(2017/12/22(Fri) 23:41:54)
DateTimePickerは複合コントロールです。ユーザーコントロールみたいなもの。
なので、マウス操作はその内部のコントロールの方で処理されて、DateTimePicker自身は処理しないのでしょう。

> 何を根拠にクリックイベントを使えるかどうか判断すれば良いですか?
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.datetimepicker.click.aspx
プログラムからは使うな、と書かれてますね。

// マウスクリックで最大値設定だと、TABキーでフォーカス移動して数字キーとかで設定、って操作した時に困るのでは。
[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86186 ] / ▼[ 86188 ]
■86187 / 9階層)  Re[9]: DateTimePickerでのクリックイベント
□投稿者/ WebSurfer (1409回)-(2017/12/22(Fri) 23:30:04)
No86186 (ちょこじー さん) に返信

> 自分では明示的にアタッチ文を書いていないので、デフォルトの設定で入っていたのでしょうか・・・?

少なくとも C# ではそんなことはないです。VB.NET では分かりません。

> 確かにプロパティウインドウにクリックイベントは表示されていませんが、
> それはテキストボックスなどでは表示されていないにも拘わらず
> 普通に使うことができます。

テキストボックスとは TextBox コントロールですよね? であれば、自分の環境ではプロパティ
ウィンドウに Click イベントは表示されてます。DateTimePicker にはありません。

すみませんが、今日はもう店じまいさせてください。
[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86187 ] / ▼[ 86193 ]
■86188 / 10階層)  Re[10]: DateTimePickerでのクリックイベント
□投稿者/ ちょこじー (8回)-(2017/12/22(Fri) 23:34:40)
No86187 (WebSurfer さん) に返信

ありがとうございます。

VBとC#でそれほど違いはあるとは思えないのですが
Visual Studioは2017をお使いでしょうか?


[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86188 ] / 返信無し
■86193 / 11階層)  Re[11]: DateTimePickerでのクリックイベント
□投稿者/ WebSurfer (1410回)-(2017/12/23(Sat) 10:37:32)
No86188 (ちょこじー さん) に返信

> VBとC#でそれほど違いはあるとは思えないのですが

DateTimePicker で Click イベントが使えない理由は Hongliang さんに No86189 で、
C# と VB.NET のイベントハンドラ設定の違いについては魔界の仮面弁士さんに No86192
説明していただけたのでそちらを見ていただくとして、

> Visual Studioは2017をお使いでしょうか?

Visual Studio Community 2015 Update 3 です。

今回のような DateTimePicker など特定のコントロールの限った話の場合、違いが出るとす
ると、C# or VB.NET の違いと .NET のバージョンの違いが可能性が高いと思います。

テンプレートを使ってプロジェクト(ASP.NET Web アプリとかの)を作る場合は、Visual
Studio のバージョンの違いも大きな影響がありますが・・・

[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86186 ] / ▼[ 86205 ]
■86192 / 9階層)  Re[9]: DateTimePickerでのクリックイベント
□投稿者/ 魔界の仮面弁士 (1523回)-(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 に記述するようになっています。
[ 親 86178 / □ Tree ] 返信 編集キー/

▲[ 86192 ] / 返信無し
■86205 / 10階層)  Re[10]: DateTimePickerでのクリックイベント
□投稿者/ ちょこじー (9回)-(2017/12/25(Mon) 13:22:43)
皆さん、丁寧な解説ありがとうございます。

非常に勉強になりました。
 
解決済み
[ 親 86178 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -