4

私が本格的なプログラミングを最後に行ったのは、25 年前に C で Kernighan と Ritchie のコピーを使用したときでした。年老いた素人に優しくしてください!

本質的には、古い null 許容の日付ピッカーです。1つの例外を除いて、完全にうまく機能するソリューションがあります。マスクされた TextBox と MonthCalendar の組み合わせを使用しています。マスクされた TextBox は、データ セットから任意の値 (null を含む) を表示し、カレンダーからの値を受け入れるだけです。カレンダーでバックスペースを押すと、マスクされた TextBox がクリアされます。すべてこれは非常に簡単です。ここで行う必要があるのは、フォーカスが失われたときにカレンダーを非表示にすることだけです。簡単な例は、私が抱えている問題を示しています。

最初のフォーカスを取得するテキスト ボックス、マスクされたテキスト ボックス、非表示の MonthCalendar を含むフォームを作成します。マスクされたテキスト ボックスの Enter イベントには、次のコードがあります。

monthCalendar1.Visible = true;
monthCalendar1.Focus();

私の意図は、次のコードを MonthCalendar の Leave イベントに入れることでした。

monthCalendar1.Visible = false;

何らかの理由で、カレンダーがフォーカスを取得するとすぐにこのコードがトリガーされ、すぐにカレンダーが再び非表示になります。デバッグにより、このコードがトリガーされることが確認されます。Leave イベントが空の場合、MonthCalendar は実際にフォーカスを取得して保持します。これは、矢印キーでカレンダーをナビゲートできるためです。

誰かがこの振る舞いを古い霧に説明できますか、それとも、私がやろうとしていることへのポインタを教えてください。

よろしくお願いします。

4

2 に答える 2

2

回避策は、Enter イベントの発生が完了するまで、MonthCalendar コントロールのフォーカスを遅らせることです。

monthCalendar1.Visible = true;
this.BeginInvoke(new Action(() => { monthCalendar1.Select(); }));
于 2013-11-08T01:10:35.537 に答える
1

見積もり:

Enter、GotFocus、Leave、LostFocus、Validating、または Validated イベント ハンドラー内からフォーカスを設定しようとしないでください。これを行うと、アプリケーションまたはオペレーティング システムが応答しなくなる可能性があります。詳細については、「キーボード入力リファレンス」セクションの WM_KILLFOCUS トピック、および MSDN ライブラリ ( http://msdn.microsoft.com/library ) の「メッセージとメッセージ キューについて」トピックの「メッセージ デッドロック」セクションを参照してください。 .

MSDNから。また、どのように入るかによって、どのイベントが起こるかについても話します:)

于 2013-11-08T01:12:20.120 に答える