2008-09-29 8 views
0

J'ai eu un problem qui a été 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 recréé à partir de la sérialisation, l'é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 non sérialisé, ça marche! Mais l'événement qui rafraîchit la grille ne semble pas du tout déclencher.C# ResetBinding retourner le DataGridView * Mise à jour avec l'exemple *

J'ai dû construire un événement à partir de mon objet complexe qui m'a dit que quelque chose change à l'intérieur. De cet événement, j'ajouté ce code:

this.bindingSource1.ResetBindings(false); 

Le problème est que la grille est en train de feuilleter et l'utilisateur ne dispose pas d'un bon sentiment (les lignes se déplacent de haut en bas et que l'arrêt). Comment réinitialiser la reliure sans avoir ce type de retournement? Comment puis-je résoudre le original problem? (Cela résoudra automatiquement tout).

Mise à jour

Voici un exemple qui font 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 BindingSource appel "bindingSource1" et allez utiliser la classe comme source de données. Créez une grille et liez la grille à bindingsource1.

Sous cette forme, utiliser 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 mis le processus de sérialisation dans le commentaire car il semble que ce ne le même comportement bizarre sans elle ... maintenant commencer l'application. Changer le nom d'un client Exemple "p1" pour "Nouveau nom" et cliquez sur la cellule sous la nouvelle. Vous verrez la colonne "len" 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 une idée pourquoi?

Répondre

0

J'ai résolu ce problème en ajoutant dans la BindingList (par héritage) une méthode [OnDeserialization] au sein du code que j'ai ajouté qui ajoute un événement sur OnListChange. De cette façon, quand 1 propriété change, toute la ligne est rafraîchie.