Comment prévenir/annuler un changement de valeur d'une combobox dans c#?

j'ai un combobox au sommet d'un formulaire qui charge des données modifiables dans les champs ci-dessous. Si l'Utilisateur a fait des changements, mais pas enregistrés, et tente de sélectionner une option différente du combobox, je veux les prévenir et leur donner une chance d'annuler ou de sauvegarder.

j'ai besoin d'un événement" BeforeValueChange " avec un argument d'événement annulable.

des conseils sur la façon d'accomplir?

22
demandé sur Jim Fell 2008-11-24 18:36:34

8 réponses

sauvegardez le SelectedIndex de ComboBox à la case à cocher s'il est entré pour la première fois, puis restaurez sa valeur lorsque vous devez annuler la modification.

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;
    }
}
16
répondu Denis Biondic 2014-02-10 19:09:23

Voici la solution la plus simple: -

        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;
        }
4
répondu Kushal Waikar 2011-04-20 15:58:03

Enregistrer la valeur actuelle sur le Enter de l'événement. Implémenter la logique BeforeValueChange dans l'événement ValueChanged , avant la logique actuelle ValueChanged . Si l'utilisateur annule, définissez la valeur stockée et ne continuez pas dans la méthode ( return ).

si vous allez beaucoup utiliser ce système, je vous suggérerais d'hériter de ComboBox et d'implémenter votre événement BeforeValuechange là-bas.

3
répondu Vincent Van Den Berghe 2008-11-24 15:47:32

l'événement de validation peut être utilisé pour ce scénario

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx

2
répondu Aleris 2008-11-24 15:46:18

Vous n'obtenez pas un événement approprié par défaut. Vous pouvez mettre en cache la valeur précédente et la remettre en place si l'utilisateur veut annuler.

1
répondu Daniel M 2008-11-24 15:47:01

Que Diriez-vous d'utiliser les événements validés / validés?

Cela fonctionne bien, si L'événement se produisant sur LostFocus au lieu de changement est ok avec vous.

sinon, que diriez-vous de

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

    // perform rest of onChange code
}
1
répondu configurator 2008-11-24 15:48:17

vous pouvez utiliser un " message filter pour intercepter les clics et les presses à clés, ce qui vous permettrait d'empêcher le comportement normal de la boîte bascule. Mais je pense que vous feriez mieux de désactiver la boîte bascule lorsque l'utilisateur fait une modification, et de lui demander de sauvegarder ou de revenir en arrière.

0
répondu Simon 2008-11-24 15:45:55

Vous ne pouvez pas vraiment l'éviter, mais vous pouvez le modifier à l'ancienne valeur si certaines conditions ne sont pas remplies:

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
répondu Tates 2018-07-16 15:02:49