Подтвердить что ты не робот

Как предотвратить/отменить изменение значения combobox в С#?

У меня есть combobox в верхней части формы, которая загружает редактируемые данные в поля ниже. Если пользователь внес изменения, но не сохранил, и пытается выбрать другой вариант из списка, я хочу предупредить их и дать им возможность отменить или сохранить.

Мне нужно событие "BeforeValueChange" с аргументом отмены события.

Любые советы о том, как это сделать?

4b9b3361

Ответ 1

Сохраните 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;
    }
}

Ответ 2

Вот простейшее решение: -

        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;
        }

Ответ 3

Сохраните текущее значение в событии Enter. Реализуйте логику BeforeValueChange в событии ValueChanged перед фактической логикой ValueChanged. Если пользователь отменяет, установите сохраненное значение и не продолжите в методе (return).

Если вы собираетесь использовать эту систему много, я бы предложил наследовать ComboBox и реализовать ваше событие BeforeValueChange.

Ответ 5

По умолчанию вы не получите соответствующее событие. Вы можете кэшировать предыдущее значение и вернуть его обратно, если пользователь хочет отменить.

Ответ 6

Как насчет использования Validated/Validated событий?
Он работает хорошо, если событие, происходящее на LostFocus вместо изменения, в порядке с вами.

В противном случае, как насчет

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

    // perform rest of onChange code
}

Ответ 7

Вы можете использовать фильтр сообщений для перехвата кликов и нажатия клавиш, что позволит вам предотвратить нормальное поведение в комбинированном поле. Но я думаю, что вам лучше отключить поле со списком, когда пользователь внесет изменения, и потребует от них сохранения или отмены изменений.