Question

J'ai eu un problème partiellement résolu. Pour l'expliquer rapidement: j'ai une grille liée à un objet complexe qui doit être sérialisé. Lorsque l'objet est construit à partir de la sérialisation, un événement comme sur la grille n'actualise pas l'affichage de la table. Quelqu'un m'a dit de reconstruire l'événement une fois désérialisé, ça marche! Mais l'événement qui actualise la grille ne semble pas se déclencher du tout.

Je devais créer un événement à partir de mon objet complexe qui me disait que quelque chose change à l'intérieur. À partir de cet événement, j'ai ajouté le code suivant:

this.bindingSource1.ResetBindings(false);

Le problème est que la grille est en train de basculer et que l'utilisateur n'a pas une bonne impression (les lignes bougent de haut en bas et s'arrêtent).

Comment puis-je réinitialiser la liaison sans avoir ce genre de retournement? Comment puis-je résoudre le problème d'origine ? (Cela résoudra automatiquement tout).

Mettre à jour

Voici un exemple qui a exactement le même comportement:

Créer une classe:

[Serializable()]
class BOClient : INotifyPropertyChanged, IDataErrorInfo
{
    private string name;
    private int len;
    public string Name
    {
        get { return name; }
        set { name = value;
        this.len = name.Length;
        if (this.PropertyChanged !=null)
            this.PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }

    public int Len
    {
        get { return this.len; }
    }

    public BOClient(string name)
    {
        this.Name = name;
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    #region IDataErrorInfo Members

    public string Error
    {
        get { return ""; }
    }

    public string this[string columnName]
    {
        get { return ""; }
    }

    #endregion
}

Maintenant, créez un formulaire avec un appel BindingSource " bindingSource1 " et allez utiliser la classe comme source de données. Créez une grille et liez-la à bindingsource1.

Sous cette forme, utilisez ce code dans la charge:

 private void Form1_Load(object sender, EventArgs e)
    {
        BindingList<BOClient> listClient = new BindingList<BOClient>();
        listClient.Add(new BOClient("P1"));
        listClient.Add(new BOClient("P2"));
        listClient.Add(new BOClient("P3"));

        //using (MemoryStream mem = new MemoryStream())
        //{
        //    BinaryFormatter b1 = new BinaryFormatter();

        //    try
        //    {
        //        b1.Serialize(mem, listClient);
        //    }
        //    catch (Exception ez)
        //    {
        //        MessageBox.Show(ez.Message);
        //    }




        //    BinaryFormatter b2 = new BinaryFormatter();

        //    try
        //    {
        //        mem.Position = 0;
        //        listClient = (BindingList<BOClient>)b2.Deserialize(mem);
        //    }
        //    catch (Exception ez)
        //    {
        //        MessageBox.Show(ez.Message);
        //    }

        //}


        this.bindingSource1.DataSource = listClient;
    }

Je mets le processus de sérialisation dans le commentaire parce qu'il semble qu'il fasse le même comportement étrange sans cela ... lancez maintenant l'application. Changer le nom d'un client. Exemple " p1 " pour " Nouveau nom " et cliquez sur la cellule sous celle modifiée. Vous verrez le " len " la colonne ne change pas. MAIS si vous cliquez sur la cellule qui a le len vous verrez le nombre changer à la bonne valeur.

Quelqu'un a-t-il une idée pourquoi?

Était-ce utile?

La solution

J'ai résolu ce problème en ajoutant dans la BindingList (par héritage) une méthode [OnDeserialization] au sein de laquelle j'ai ajouté du code qui ajoute un événement sur OnListChange. Ainsi, lorsque 1 propriété change, toute la ligne est actualisée.

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