0

フォーマットを実行しようとしましたが、フォーマットの結果は正常に機能しています。問題は、Textbox LostFocus および GotFocus イベントのループです。そのため、デバッグでは互いにジャンプしていて、何が間違っているのかわかりません。

NUMBERS の変換は正常に機能しています。これは単なるループです。テキストボックスをマウスでクリックすると開始されます:txtBase2

  1. txtBase2_GotFocus イベント行 8 に入ります。

  2. 次に9行目が実行されます

  3. 次に、3行目のtxtBase2_Lostfocusメソッドにジャンプします

  4. その後、再びlin8へのtxtBase2_GotFocusメソッドに戻ります。

これらの上記の 4 つの手順はループのままです...そして停止しません。何が間違っていますか? または、私が見ていないものは何ですか?

ps: Amount 値に対して変換が行われます。

全体のアイデアは次のとおりです。

  • ユーザーがテキストボックスに金額を入力し、テキストボックスを離れると、次のようにフォーマットする必要があります: 1.245,12 (桁区切りあり)

  • ユーザーがテキストボックスを離れ、金額/数字がある場合、テキストボックスの数字は 1245,12 のようにフォーマットする必要があります (千区切りなし)

フォーマットの変換は正常に機能しますが、これらの 2 つのイベントとループしています!!!!!

winforms、C#、.NET 4.5

ご意見をお聞かせください?

     protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        txtBase2.LostFocus += txtBase2_LostFocus;
        txtBase2.GotFocus += txtBase2_GotFocus;

    }



 private void txtBase2_LostFocus(object sender, EventArgs e)
    {
        Line 1:/ /when leaving the TEXTBOX
        Line 2: //input: 1234,56
        Line 3: double toDouble = Convert.ToDouble(txtBase2.Text);
        Line 4: string jj = toDouble.ToString("n", System.Globalization.CultureInfo.GetCultureInfo("NL-be"));
        //output: 1.234,56
        Line 5: txtBase2.Text = jj.ToString();
    }

    private void txtBase2_GotFocus(object sender, EventArgs e)
    {
        Line 6: //when Entering (get in) the TEXTBOX
        Line 7: //input 1.234,56
        Line 8: CultureInfo ci = CultureInfo.GetCultureInfo("NL-be");
        Line 9: string decimalFormatted = Convert.ToDecimal(txtBase2.Text, ci).ToString();
        //Output 1234,56
        Line 10: txtBase2.Text = decimalFormatted;
    }
4

2 に答える 2

1

自分のマシンでWindows8を実行しているため、これをテストすることはできなくなりましたが、このコードは危険です。Windowsメッセージループの非常に脆弱なポイントで例外をスローする可能性が非常に高くなります。EXEプロジェクトのプラットフォームターゲットがx86に設定されている64ビットオペレーティングシステム(VistaおよびWin7)での問題。「ファーストチャンス」例外通知の出力ウィンドウを調べることで、その理論を確認できます。そして、デバッグ+例外で診断し、CLR例外の[スロー]チェックボックスをオンにします。または、プラットフォームターゲットをAnyCPUに変更します。

GotFocusとLostFocusにクーティーがあることを示すもう一つの強力な指標は、デザイナーで目に見えるイベントを見ることです。テキストボックスを選択し、[プロパティ]ウィンドウの稲妻アイコンをクリックします。GotFocusとLostFocusの両方がそこにリストされていないことに注意してください。EnterイベントとLeaveイベントは代替手段です。

これは別の方法で行う必要があります。何よりもまず、Decimal.TryParse()を使用して、例外なく変換が失敗したことを確認する必要がありますこれは予想される失敗です。ユーザーはテキストボックスを空のままにするか、数字ではない文字列を入力する可能性があります。もちろん、それが起こったときにプログラムがクラッシュすることは望ましくありません。

次に、LeaveまたはLostFocusイベントの代わりにValidatingイベントを使用します。e.Cancel = trueを設定して、フォーカスの変更を防ぎ、ユーザーに有効な番号を入力させることができます。ErrorProviderコンポーネントを使用して、テキストが変換できない場合に警告を表示します。これを正しく行っている場合は、Enterイベントはもう必要ありません。これを行うNumberBoxコントロールについては、この回答を確認してください。

于 2013-03-21T13:01:19.220 に答える
0

これは、ハンドラー内で Control.Text プロパティを設定した場合の副作用である可能性があります。

代わりにEnterおよびLeaveイベントを実際に使用する必要があります。

Control.GotFocus()のドキュメントには、次のように書かれています。

通常、GotFocus および LostFocus イベントは、UICues を更新するとき、またはカスタム コントロールを作成するときにのみ使用されます。代わりに、Activated および Deactivate イベントを使用する Form クラスを除くすべてのコントロールに対して、Enter および Leave イベントを使用する必要があります。

代わりにEnterandを使用しても問題は発生しますか?Leave

また、Control.Text を設定したコードをコメントアウトすると問題が発生しますか?

于 2013-03-21T12:26:37.687 に答える