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?
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;
}
}
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;
}
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.
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
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.
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
}
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.
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;
}
}