Как предотвратить / отменить изменение значения комбинированного списка в c #? - PullRequest
22 голосов
/ 24 ноября 2008

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

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

Какой-нибудь совет о том, как достичь?

Ответы [ 8 ]

16 голосов
/ 03 сентября 2009

Сохраните SelectedIndex ComboBox, когда в поле, если он был введен впервые, а затем восстановите его значение, когда вам нужно отменить изменение.

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;
    }
}
4 голосов
/ 20 апреля 2011

Вот самое простое исправление: -

        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 голосов
/ 24 ноября 2008

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

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

2 голосов
/ 24 ноября 2008

В этом сценарии можно использовать событие Validating
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx

1 голос
/ 24 ноября 2008

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

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

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

    // perform rest of onChange code
}
1 голос
/ 24 ноября 2008

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

0 голосов
/ 16 июля 2018

Вы не можете реально предотвратить это, но вы можете изменить его обратно на старое значение, если не выполнены определенные требования:

private SomeObject = selectedSomeObject=null;

private void cbxTemplates_SelectionChangeCommitted(object sender, EventArgs e)
{
  if (!(sender is ComboBox cb)) return;
  if (!(cb.SelectedItem is SomeObject tem)) return;
  if (MessageBox.Show("You sure?", "??.",
        MessageBoxButtons.OKCancel) != DialogResult.OK)
    cb.SelectedItem = selectedSomeObject;
  else
  {
    selectedSomeObject = tem;
  }
}
0 голосов
/ 24 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...