Как предотвратить/отменить изменение значения combobox в С#?
У меня есть combobox в верхней части формы, которая загружает редактируемые данные в поля ниже. Если пользователь внес изменения, но не сохранил, и пытается выбрать другой вариант из списка, я хочу предупредить их и дать им возможность отменить или сохранить.
Мне нужно событие "BeforeValueChange" с аргументом отмены события.
Любые советы о том, как это сделать?
Ответы
Ответ 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
.
Ответ 4
Событие Validating можно использовать для этого сценария
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
Ответ 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
Вы можете использовать фильтр сообщений для перехвата кликов и нажатия клавиш, что позволит вам предотвратить нормальное поведение в комбинированном поле. Но я думаю, что вам лучше отключить поле со списком, когда пользователь внесет изменения, и потребует от них сохранения или отмены изменений.