IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET]Pb Sérialisation, Databinding et Formulaires


Sujet :

Windows Forms

  1. #1
    Membre du Club Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Points : 42
    Points
    42
    Par défaut [VB.NET]Pb Sérialisation, Databinding et Formulaires
    Bonjour,

    J'ai un formulaire contenant des TextBox et ComboBox databindés à des propriétés d'un objet.

    Je sauvegarde l'objet par la sérialisation. Pas de problème.
    Je rappelle l'objet par la désérialisation. problème : l'objet est bien revenu, ses propriétés ont la bonne valeur, mais mon formulaire n'est pas mis à jour : les textBox et ComboBox n'ont pas détecté le changement ??

    Je précise que le databinding entre mes TextBox et mes propriétés marche bien, dans les deux sens.
    Pour le databinding, j'utilise du code du genre :
    "monTextBox.DataBindings.Add("text", ...)" et la classe de mon objet implemente INotifyPropertyChanged avec tout le code qui va bien.

    Mon objet sérialisé n'est pas déclaré comme une propriété mais comme un objet "Shared". C'est peut-être de là que vient le problème : en désérialisant, je change la référence sur cet objet et aucun événement du genre "PropertyChanged" n'est généré.

    Que faire ??

  2. #2
    Membre du Club Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Points : 42
    Points
    42
    Par défaut
    J'ai changé mon objet en une propriété qui appelle "NotifyPropertyChanged()".

    Cet évènement est bien lancé quand j'importe l'objet via la désérialisation, mais rien ne change dans le formulaire .

    Mais que faire ???

  3. #3
    Membre du Club Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Points : 42
    Points
    42
    Par défaut
    Bon, en fait la sérialisation n'y est pour rien.
    mais le problème demeure...

    Au lieu de récupérer l'objet sérialisé, je le réinstancie : c'est le même comportement : la référence sur l'objet est changée.
    Et c'est bien ça qui a l'air de coincer.

    Voilà mon code.

    La classe de mon objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Imports System.ComponentModel
     
    <Serializable()> Public Class MonObjet
        Implements INotifyPropertyChanged
     
        Private p As String
        Public Property param() As String
            Get
                Return p
            End Get
            Set(ByVal value As String)
                p = value
                NotifyPropertyChanged("param")
            End Set
        End Property
     
     
        Public Sub New()
            p = "coucou"
        End Sub
     
        Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
     
        Private Sub NotifyPropertyChanged(ByVal info As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
        End Sub
     
    End Class

    et Ma classe principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    Public Class MainInterface
        Implements INotifyPropertyChanged
    
        ...
        Private mo As MonObjet
    
        Public Property monObjet() As MonObjet
            Get
                Return mo
            End Get
            Set(ByVal value As MonObjet)
                mo = value
                NotifyPropertyChanged("monObjet")        End Set
        End Property
    
        Public Sub New()
            ...
            monObjet = New MonObjet()
            monTextBox.DataBindings.Add("Text", monObjet, "param", True, DataSourceUpdateMode.OnPropertyChanged)    End Sub
    
        Public Sub changeParam()
             Me.monObjet = New MonObjet()    // ***********************V'là l'problème : le TextBox n'est pas mis à jour...
        End Sub
    
        Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    
        Private Sub NotifyPropertyChanged(ByVal info As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
        End Sub
    
    End Class
    J'adore le débuggage. Le débugage, c'est trépidant...

  4. #4
    Membre du Club Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Points : 42
    Points
    42
    Par défaut
    Encore une indication :
    Si l'objet que je sérialise est contenu dans un autre objet, ça marche !!

    C'est-à-dire, si j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.autreObjet.monObjet = New MonObjet()
    alors le textBox lié à autreObjet.monObjet.param est mis à jour.

    avec l'autreObjet défini comme monObjet (Implements INotifyPropertyChanged...), et monObjet devenant une propriété de autreObjet.

    Je ne sais pas si je suis clair...
    Donc ça plante peut-être parce que c'est le formulaire principal (MainInterface), qui implémente le INotifyPropertyChanged ??
    Pourtant je ne vois aucune différence entre les classes MainInterface et celle de l'autreObjet...

Discussions similaires

  1. [C# .NET 2.0] Databinding avec ArrayList
    Par Sylvain James dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2006, 10h57
  2. [VB.NET]hide,close,end. fermeture formulaires
    Par mAAL dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/03/2006, 10h03
  3. [VB.NET] Datagrid comme un sous formulaire
    Par Golzinne dans le forum Windows Forms
    Réponses: 6
    Dernier message: 27/11/2005, 19h19
  4. [VB.NET] [PPC] Comment faire un formulaire sur pls pages?
    Par papy27 dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 03/06/2004, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo