Winforms ComboBox SelectedItem le changement n'affecte pas la source de bindings

je fais l'application C# / WinForms. Le problème que je n'ai pas pu résoudre (encore) est que lorsque je change le Sélecteditem de ComboBox de façon programmatique, il est modifié jusqu'à ce que le ComboBox perde la mise au point, après cela il "rappelle" sa valeur avant d'assigner le Sélecteditem. Je pense qu'il prend l'ancienne valeur de liant source. Lors du choix d'un élément en utilisant L'interface utilisateur, l'objet lié sous-jacent est mis à jour normalement, mais il n'en est pas ainsi lorsque j'attribue une nouvelle valeur à SelectedItem. en programmant.

juste pour des infos supplémentaires: j'essaie d'implémenter "undo", ce qui signifie que je sauvegarde chaque changement quelque part et que lorsque je édite>>Undo, j'inverse tous les changements effectués par l'utilisateur. Ce qui est intéressant, c'est que les autres contrôles (boîtes de textes, Numéricupdowns) fonctionnent bien.

Voici les Détails:

j'ai un ComboBox que je lie à L'objet ComboItem comme ceci:

ComboBox comboBox = new ComboBox();
List<ComboItem> items = new List<ComboItem>();
ComboList comboList = Configuration.ComboList.LoadComboList();

Combo myCombo = comboList.GetCombo(control.MemberName);
if (myCombo != null)
{
    items.Add(new ComboItem(0, "", 0.0, 0.0));
    for (int index = 0; index < myCombo.ComboItems.Count; index++)
    {
        items.Add(myCombo.ComboItems[index]);
    }
}

où Combo et ComboList sont des classes sur mesure pour le chargement les données à partir du fichier de configuration. Puis j'ai défini les membres Display et Value ainsi que DataSource:

comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Key";
comboBox.DataSource = items;

"Texte" et les "Clés" sont les membres de ComboItem de la classe:

public class ComboItem
{
    public int Key { get; set; }
    public string Text { get; set; }
    public double Coef1 { get; set; }
    public double Coef2 { get; set; } 

    public void CopyValues() {...}
    public override bool Equals() {...}
}

maintenant le problème: lors de l'exécution d'undo je vérifie tout ce qui était nécessaire pour avoir toutes les opérations de fonte en sécurité et en essayant de "undo" avec ce code:

Logger.Info(controls[0], op, "ExecuteUndo");
((ComboBox)controls[0]).Focus();
((ComboBox)controls[0]).SelectedItem = (ComboItem)op.GetOldValue();
Logger.Info(controls[0], "AFTER CHANGE");

Logger est en train de se connecter. l'objet op est pris dans la séquence d'Annulation et donne la valeur appropriée en utilisant "GetOldValue()". Ce code affecte en fait L'interface utilisateur, mais jusqu'à ce que le contrôle perde sa concentration. Cela se produit sur la prochaine Annulation qui devrait affecter d'autres contrôles et donc laisser ce combobox pour perdre la mise au point.

je suis sûr que cela se produit sur l'événement comboBox_LostFocus car la première chose que je fais sur cet événement est la journalisation et elle me montre déjà la valeur qui ne devrait pas l'être.

8
demandé sur Revaz 2011-12-12 12:55:26

1 réponses

je pense que le problème que vous rencontrez est que le ComboBox affiche une valeur, mais n'a pas encore écrit la valeur à la source de liaison (ce qui ne se produit pas tant que vous ne perdez pas la mise au point).

vous pouvez essayer de faire quelque chose comme ça pour écrire les données quand un item est sélectionné (en supposant qu'il n'y ait qu'une seule databinding associée au ComboBox):

private void comboBox_SelectedIndexChanged(object sender, EventArgs e) {
  comboBox.DataBindings[0].WriteValue();
}

et juste pour être sûr, soit vous vous abonnez à cet événement de la part du concepteur, soit vous l'envoyez par télégramme. manuellement:

public Form1() {
  InitializeComponent();
  comboBox.SelectedIndexChanged += comboBox_SelectedIndexChanged;
}
14
répondu LarsTech 2011-12-12 14:17:00