Existe-t-il une BeforeUpdate pour une ComboBox C # sur un Winform?
-
06-07-2019 - |
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.
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.