- PR -

DateTimePickerのバグ?

1
投稿者投稿内容
あき
会議室デビュー日: 2005/01/22
投稿数: 2
投稿日時: 2005-01-22 12:57
どなたかご教授ください
OS:WinXp
Vb .NET 2003

1)TextBoxのLeaveイベントにエラーメッセージをいれる
エラー時はFocusをTextBoxに戻す
2)チェックボックス付きのDateTimePickerをもつユーザーコントロールを
同じフォームに貼り付ける。
(ユーザーコントロール上だけでなく普通のDateTimePickerでも
同じ現象が起こります)
4)TextBoxにLeaveでエラーになる条件をいれ
DateTimePickerをマウスでクリックするとエラーメッセージが
2回でてしまいます。
さらにDateTimePickerをクリックできてしまいます。
その後 どのコントロールをクリックしても2回出るようになってしまいます。

他のコントロールをマウスでクリックしても1回エラーメッセージが出力されて
TextBoxにフォーカスが戻るのですがDateTimePickerだけこのような現象が
おきてしまいます。

これはバグでしょうか?それともやり方がまずいのでしょうか?
(ちなみにメッセージは
Call MessageBox.Show("エラーメッセージ" _
, "タイトル"_
, MessageBoxButtons.OK_
, MessageBoxIcon.Error_
, MessageBoxDefaultButton.Button1)
で表示しています。
どなたかよろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-01-22 16:53
代わりにトラックバック。
http://www7.big.or.jp/~pinball/discus/vb/57085.html
_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-22 19:49
ん〜、わからん。

引用:

あきさんの書き込み (2005-01-22 12:57) より:

4)TextBoxにLeaveでエラーになる条件をいれ


 Leaveでエラーになる条件?Leaveイベント中にエラーになる条件をいれるのですか?「エラーになる条件」とはなんですか?もしくは何がエラーなんですか?それを、どこにいれるのですか?
 それとも、『LeaveイベントでのチェックでエラーになるようなテキストをTextBox1に入力して』という意味でしょうか?

 「わかってんならいちいち聞くな」とおっしゃるかもしれませんが、自分のしたいことを正しく表現できないというのは、システムエンジニアとして恥ずかしいと思いますよ。「自分はいつまでもコーダーだ」とおっしゃるなら、それもかまわないかもしれませんが、人に聞くときに真意を伝えられないのでは、損をすると思うのですが、いかがでしょうか。


 こっちに返しておくので、“両方とも”きっちり対応してくださいね。
_________________
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-22 20:14
ノートン君が悪さしているのか、あっちに書き込めないのでこっちに書いておく。


まず一度、あなたの周りの、あなたの仕事に関係のない人に、「こういう現象が発生して、こういうことが問題で、自分では解決できないので、こういうことを聞こうと思う。ところで、今の話理解できた?」と聞いてみてください。その人が理解できるまで、説明を繰り返してください。最終的に伝わったことを、書き込んでください。

そんな時間をかけている時間がない、とおっしゃるかもしれませんが、すでに7時間かかっています。このままではそれ以上の時間をかけることになると思います。
_________________
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-22 22:47
 現象確認しました。DropDownListでも同様の現象が発生しても良さそうですが、DateTimePickerだけみたいですね。

 これ、確か使用するDLLが違うんですよね。Win32APIレベルの話ですが。なので、DatetimePickerと同じDLLを使用するListViewを貼り付けてみると、クリックの仕方によって2度表示される時があります。おそらく、描画の仕方の問題でしょう。ListViewの方で2度表示されるのは、選択用の…なんだっけ?ラバーバンド?…選択領域を示す破線が表示されるときでした。

 ちなみに、右クリックでコンテキストメニューを出してやると、次からは1回になりました。
 何かを描画しようとして、それがキャンセルされ、でも実は描画しようとする意図だけは残っていて、それがフォーカスを移そうとしており、他のコントロールをクリックすると、DateTimePickerの描画で1回、コントロールへのフォーカス移動で1回、フォーカス移動が発生しているのではないかと思われます。

 あくまでも推測です。



 まぁ、昔からDateTimePickerは、つまらんバグがありましたから。
#####
Windows95の頃
IMEをONにして、キーを一度に大量に押すと、アプリケーションが落ちる。
一太郎についていたDLLと、OfficeについていたDLLでバージョンが違ったので、一太郎のものを入れいると、別のことで落ちる(詳細忘れた)。
バージョンが上のOfficeのものを入れると、それは直っているが、元の大量押しで落ちる件が復活する。
_________________
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-22 23:31
 同じような時間で、あっちにはレスつけているのにこっちにはついていないのは、なんかむなしいなぁ。

 DateTimePickerだけ、Validatingイベントに移さず、全部のチェックをValidatingに移すべきでは?というのも、Validatingは、その名の通り「検証中」のイベントなのですから。と思ったのですが、Validatingでも一緒だった。
 Focusでやるからかなぁ?と思ってSelectにしてみたが、一緒だった。
<追加>なんだ。Validatingイベントだと、引数が違うじゃないか。e.Cancel=Trueで、フォーカスが移らない。ここでメッセージボックス表示するようにして、TextBox.Focusはしない。DateTimePickerで検証場所を移せたんだったら、「検証のために用意されているイベントですから」という理由で、全コントロールの検証場所も移せるでしょ。すべて統一できるんだし。</追加>
しかし、Tabキーで遷移するときは1つ。イベントの発生順序が関係するのかも。


 ところで、ふと思ったのですが、そのフォームには入力をキャンセルするようなコントロールはないのでしょうか。あるいは、右上の「×」ボタンとか。こういうものがあるなら、無理矢理フォーカスを移動させるのは、やめた方がよいかと。というのは、入力を取りやめたいのに、正しいとされる値を入力しないと、キャンセルすることもできないからです。
 Validatingで行うなら、CauseValidationプロパティで、検証を無効にすることができます。ただし、コマンドボタン(フォームタイトル上のボタン)にはこのプロパティがありませんので、消しておく方がよいでしょう。

[ メッセージ編集済み 編集者: Jitta 編集日時 2005-01-22 23:45 ]
あき
会議室デビュー日: 2005/01/22
投稿数: 2
投稿日時: 2005-01-23 02:06
返事が遅れてしまって
申し訳ありません。

たくさんの人に
おしかりを受け
少し自分のコミュニケーション不足と
軽率さにがっかりきています。

こちらで試してみたのですが
TextBox側のValidating内で
e.Cancel=Trueを記述したのですが
ユーザーコントロール上のDateTimePickerにフォーカスが
移ってしまいました。。

なぜかユーザーコントロール上のDateTimePickerを
クリックした時にTextBox側のValidatingイベントが2回
実行されてしまいます。

もう少しこちらでも検証してみます。
ありがとうございました

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-01-23 10:53
 叱ってもしょうがないからね。名前変えて別人装うこともでいるんだし。単に「なんでこういうのがいつまでも続くんだろ?」ってだけで。だからこそ、知識を共有データベース化したい、って思うわけで。

引用:

あきさんの書き込み (2005-01-23 02:06) より:

こちらで試してみたのですが
TextBox側のValidating内で
e.Cancel=Trueを記述したのですが
ユーザーコントロール上のDateTimePickerにフォーカスが
移ってしまいました。。

なぜかユーザーコントロール上のDateTimePickerを
クリックした時にTextBox側のValidatingイベントが2回
実行されてしまいます。


 私の方はフォーム上に直においたものなので、ユーザコントロールにすると何か違うのかもしれません。単純にフォーム上に置いたものと比べてみてください。

 その次に、ユーザコントロール上のDateTimePicker、問題のTextBoxの、すべての・・・ええっとこのPCには環境が入っていないのですが、Control.Validatingイベントの説明のところに、フォーカスが移るときに発生するイベントと、その順番が書いてあります。そこに書いてあるすべてのイベントをハンドリングして、System.Diagnotics.Debugのメソッドで、どのイベントが、どういう順番で動作しているか、確認してみてください。あるいは、ユーザコントロールとしているパネルにフォーカスが移って1回、DateTimePckerに移って1回、発生しているかもしれません。(超テキトー)
_________________
1

スキルアップ/キャリアアップ(JOB@IT)