25

編集可能なデータを下のフィールドにロードするフォームの上部にコンボボックスがあります。ユーザーが変更を行ったが保存されておらず、コンボボックスから別のオプションを選択しようとした場合、警告してキャンセルまたは保存する機会を与えたいと思います。

キャンセル可能なイベント引数を持つ「BeforeValueChange」イベントが必要です。

達成方法に関するアドバイスはありますか?

4

8 に答える 8

19

最初に入力した場合は、ComboBoxのSelectedIndexをいつボックスに保存し、変更をキャンセルする必要がある場合はその値を復元します。

cbx_Example.Enter += cbx_Example_Enter;
cbx_Example.SelectionChangeCommitted += cbx_Example_SelectionChangeCommitted;

...

private int prevExampleIndex = 0;
private void cbx_Example_Enter(object sender, EventArgs e)
{
    prevExampleIndex = cbx_Example.SelectedIndex;
}

private void cbx_Example_SelectionChangeCommitted(object sender, EventArgs e)
{
    // some custom flag to determine Edit mode
    if (mode == FormModes.EDIT) 
    {
        cbx_Example.SelectedIndex = prevExampleIndex;
    }
}
于 2009-09-02T23:34:44.827 に答える
8

これが最も簡単な修正です:-

        bool isSelectionHandled = true;

        void CmbBx_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (isSelectionHandled)
            {
                MessageBoxResult result = MessageBox.Show("Do you wish to continue selection change?", this.Title, MessageBoxButton.YesNo, MessageBoxImage.Question);
                if (result == MessageBoxResult.No)
                {
                    ComboBox combo = (ComboBox)sender;
                    isSelectionHandled = false;
                    if (e.RemovedItems.Count > 0)
                        combo.SelectedItem = e.RemovedItems[0];
                    return;
                }
            }
            isSelectionHandled = true;
        }
于 2011-04-20T15:58:03.280 に答える
3

イベントの現在の値を保存しますEnter。実際のロジックの前にBeforeValueChange、イベントにロジックを実装します。ユーザーがキャンセルした場合は、保存されている値を設定し、メソッド()を続行しないでください。ValueChangedValueChangedreturn

このシステムを頻繁に使用する場合は、ComboBoxを継承し、BeforeValuechangeそこでイベントを実装することをお勧めします。

于 2008-11-24T15:47:32.637 に答える
2

Validating イベントは、このシナリオで使用できます
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx

于 2008-11-24T15:46:18.693 に答える
1

デフォルトでは、適切なイベントは発生しません。ユーザーがキャンセルしたい場合は、前の値をキャッシュして、その値に戻すことができます。

于 2008-11-24T15:47:01.513 に答える
1

検証/検証済みイベントを使用するのはどうですか?
ChangeではなくLostFocusで発生するイベントに問題がなければ、うまく機能します。

そうでなければ、どうですか

public void Combobox_ValueChanged(object sender, EventArgs e) {
    if (!AskUserIfHeIsSureHeWantsToChangeTheValue())
    {
        // Set previous value
        return;
    }

    // perform rest of onChange code
}
于 2008-11-24T15:48:17.283 に答える
0

メッセージ フィルターを使用して、クリックやキーの押下を傍受することができます。これにより、コンボ ボックスの通常の動作を防ぐことができます。ただし、ユーザーが変更を加えたときにコンボ ボックスを無効にして、変更を保存するか元に戻すように要求する方がよいと思います。

于 2008-11-24T15:45:55.387 に答える