0

私はComboBox.SelectionChangeCommittedイベントでいくつかの奇妙な行動を経験していて、誰かがそれについての説明を持っているかどうか疑問に思っています。

イベントハンドラのどこかで、を呼び出しますMessageBox.Show。で新しい値を選択しComboBox、コードによってがMessageBoxポップアップ表示される場合、選択した値が元の値に戻されるのがわかります。

デバッグ時に、選択した値がの前に正しいことがわかりますMessageBox.ShowMessageBox.Show「はい」または「いいえ」をクリックするまで、ユーザーに制御を戻します。オプションの1つをクリックすると、controlがデバッガーに戻りComboBox、変更前の元の値に戻ります。

選択した値を他の場所にプログラムで設定していないので、値が元に戻される理由がわかりません。イベントハンドラーがポップしない場合MessageBox、選択されたものは元に戻されません。

イベントの処理が完了する前にUIに制御を戻しているという事実は、それと関係がある可能性があります。もしそうなら、それを回避するためのクリーンな方法はありますか?現在、ポップする前に選択した値をキャプチャし、MessageBox後でリセットしていますが、問題を修正するために「ハック」に頼る必要はありません。

4

3 に答える 3

3

問題は、メッセージボックスを表示する動作により、コンボボックスのドロップダウンメニューが閉じ、ユーザーが行ったコミットされていない選択が放棄される可能性があります。

基本的には、コンボボックスをドロップダウンし、リスト内の項目を強調表示してから、Escキーを押すのと同じです。コンボボックスが閉じられる前に選択したことがないため、強調表示された項目は選択された項目にならないことに注意してください。([実行]ダイアログで簡単に試すことができます。)

これは、メッセージボックスをあちこちに投げるのが悪い考えである多くの理由の1つです(他の理由には、ユーザーにとって視覚的に不快なメッセージボックスがあり、ほとんどの人がとにかくそれらを読むことさえ気にしないことが含まれます) 。メッセージボックスをデバッグの補助として使用することを好むプログラマーは、UIコードをデバッグしようとすると、この正確なシナリオに悩まされることがよくあります。

解決策は次のいずれかです。

  1. フォーム全体がコミット/送信されるまで検証を延期します。その時点で、現在ドロップダウンされているコンボボックスを放棄するリスクを冒すことなくメッセージボックスを表示できます。

  2. 検証エラーを表示する別の(つまり、非モーダル)方法を見つけます。WinFormsは、ErrorProviderこの目的に使用できるコントロールを提供します。一般的な使用法は、無効な値を持つコントロールの横に小さな警告またはエラーアイコンを表示することです。ユーザーはそのアイコンにカーソルを合わせると、正確なエラーに関する詳細情報を含むツールチップが表示されます。

または、おそらく両方のアプローチの組み合わせで、ユーザーは即座にフィードバックを得ることができますが、入力フォームの外部で不正な形式の入力を処理する必要がないことも保証されます。

于 2013-02-07T20:28:03.093 に答える
1

ComboBox私が使用していた のサブクラスが関連する機能を追加していないという私の仮定は間違っていました。この問題は、LostFocus私が知らなかったイベントハンドラーが原因で、ComboBox値が元に戻ったことが原因でした。

于 2013-02-08T13:27:32.163 に答える
0

以下のコードを使用して問題を再現できませんでした。これは、あなたが言っていることの本質です。コンボボックスの値が更新されます。SelectionChangeCommitted コードを投稿すると、より良い解決策が得られる場合があります。

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
        {
            try
            {
                ComboBox cb = (ComboBox)sender;
                string check1 = cb.Text;
                MessageBox.Show("Messagebox check");
                string check2 = cb.Text;
                MessageBox.Show(check1 + "\n\n" + check2);
                //check 1 and 2 show the old value.  Once the method leaves then the value in the combobox is updated.
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
于 2013-02-07T21:32:50.450 に答える