Question

Je viens du monde VBA et n’oubliez pas qu’il y avait un appel BeforeUpdate que je pouvais passer dans une liste déroulante. Maintenant, je suis en C # (et j'adore ça) et je me demandais s'il y avait un appel BeforeUpdate pour un ComboBox sur un Winform?

Je peux créer une zone de texte invisible et stocker les informations dont j'ai besoin. Après la mise à jour, recherchez dans cette zone les informations dont j'ai besoin, mais j'espérais une solution plus simple.

Était-ce utile?

La solution

Vous pouvez envisager SelectionChangeCommited .

À partir de MSDN:

  

SelectionChangeCommitted est déclenché   seulement quand l'utilisateur change de combo   sélection de la boîte. Ne pas utiliser   SelectedIndexChanged ou   SelectedValueChanged pour capturer l'utilisateur   changements, parce que ces événements sont également   relancé lorsque la sélection change   par programmation.

Cela ne fonctionnera pas si vous avez paramétré votre liste déroulante pour permettre à l'utilisateur de taper dans la zone de texte. En outre, il ne vous dira pas quel était le dernier élément sélectionné. Vous devrez mettre cette information en cache. Cependant, vous n'avez pas besoin de stocker vos informations dans une zone de texte. Vous pouvez utiliser une chaîne.

Autres conseils

L’un des avantages de WF est que vous pouvez facilement créer le vôtre. Ajoutez une nouvelle classe à votre projet et collez le code ci-dessous. Compiler. Déposez le nouveau contrôle du haut de la boîte à outils sur votre formulaire. Implémentez l'événement BeforeUpdate.

using System;
using System.ComponentModel;
using System.Windows.Forms;

public class MyComboBox : ComboBox {
  public event CancelEventHandler BeforeUpdate;

  public MyComboBox() {
    this.DropDownStyle = ComboBoxStyle.DropDownList;
  }

  private bool mBusy;
  private int mPrevIndex = -1;

  protected virtual void OnBeforeUpdate(CancelEventArgs cea) {
    if (BeforeUpdate != null) BeforeUpdate(this, cea);
  }

  protected override void OnSelectedIndexChanged(EventArgs e) {
    if (mBusy) return;
    mBusy = true;
    try {
      CancelEventArgs cea = new CancelEventArgs();
      OnBeforeUpdate(cea);
      if (cea.Cancel) {
        // Restore previous index
        this.SelectedIndex = mPrevIndex;
        return;
      }
      mPrevIndex = this.SelectedIndex;
      base.OnSelectedIndexChanged(e);
    }
    finally {
      mBusy = false;
    }
  }
}

Vous pouvez essayer ValueMemberChanged, Validating, SelectedIndexChanged ou TextChanged. Ils ne se déclenchent pas comme avant la mise à jour, mais vous pouvez regarder ce qui sera mis à jour et gérer la mise à jour ou la refuser.

Hors de la boîte, rien de tel. Tous les événements relatifs aux modifications dans la liste déroulante se produisent une fois que la nouvelle valeur est déjà sélectionnée. À ce stade, il n’ya aucun moyen de dire quelle est la valeur UTILISÉE. Votre meilleur pari est ce que vous avez échappé. Dès que votre zone de liste déroulante est remplie, enregistrez l'élément SelectedItem dans une variable temporaire. Ensuite, connectez-vous à l'événement SelectedValueChanged. À ce stade, votre variable temporaire sera votre ancienne valeur et le SelectedItem sera votre valeur actuelle.

private object oldItem = new object();

        private void button3_Click(object sender, EventArgs e)
        {
            DateTime date = DateTime.Now;
            for (int i = 1; i <= 10; i++)
            {
                this.comboBox1.Items.Add(date.AddDays(i));
            }

            oldItem = this.comboBox1.SelectedItem;
        }

        private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            //do what you need with the oldItem variable
            if (oldItem != null)
            {
                MessageBox.Show(oldItem.ToString());
            }

            this.oldItem = this.comboBox1.SelectedItem;
        }

Je pense que ce que vous vouliez, c'était l'événement DropDown. Il vous indiquera quelle est la valeur avant que l'utilisateur ne la modifie. Cependant, il se peut que l'utilisateur ne change rien, il n'est donc pas identique à BeforeUpdate.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top