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

VB.NET Discussion :

problème avec le contrôle RichtextBox lié à une base de données


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut problème avec le contrôle RichtextBox lié à une base de données
    Bonjour à tous, j'espère que vous pourrez m'aider sur un problème plutôt difficile très difficile à régler d'ou la longeur du message pour mieux comprendre ce qui se passe.
    C'est la faute au comportement plutôt étrange du contrôle RichTextBox dés lors que celui-ci est utilisé avec du texte enrichie et lié à une base de données. En effet je ne sais pas si vous avez remarqué mais celui-ci à une fâcheuse tendance à modifier la propriété HasChanges du Dataset alors que je ne fait que de la navigation ou de la lecture. C'est très problématique puisque je me sers de cette propriété pour détecter les modifications effectuées dans le programme pour proposer un enregistrement à la fermeture du programme. Du coup j'ai systématiquement une proposition de sauvegarde à la fermeture du programme alors que je n'ai rien modifié.
    Pour régler ce problème j'ai supprimé le binding direct de ce contrôle avec la source de données pour utiliser à la place la méthode Writevalue pensant ainsi que je pourrais rectifier le comportement de ce contrôle. Cette solution m'a permis effectivement de régler le problème de la modification de hasChanges du DataSet pendant la lecture et la navigation. Maintenant j'ai du trouver un moyen de détecter les modifications dans le contrôle lui-même : pour cela je fait un WriteValue dans l’évènement Validating du contrôle. Problème : je retombe à nouveau dans la même problèmatique, c'est à dire :

    j'ai 2 événements validating qui se produisent
    - le 1er est voulu et se déclenche soit en sortant du contôle soit au moment d'enregistrer en forçant l'exécution de cet évènement.
    - le 2eme n'est pas voulu : il se produit si le 1er évènement à eu lieu et en sortant du contôle.
    - la propriété HasChanges repasse à True aprés que le 2éme évenement validating se soit produit.

    Extrait de code pour mieux comprendre :

    l'evenement validating :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim BindingSourceTaches As BindingSource
    Dim BindRichTextBox As Binding
     
    AddHandler RichTextBoxJmb1.RichTextBox.Validating, AddressOf EventRichTextBoxValidating
    Private Sub EventRichTextBoxValidating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
            BindRichTextBox.WriteValue()
            BindingSourceTaches.EndEdit()
    End Sub
    la méthode enregistrer qui se produit si HasChanges=True à la fermeture du logiciel : (A noter que les contrôles RichtextBox se trouvent sur des feuilles MDIChild)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Enregistrer()
            For Each frm As Form In Me.MdiChildren
                frm.ValidateChildren() ' Obligatoire sinon les modifications dans les controles RichTextBox sont perdues.
            Next
            Call SaveDataset() ' procédure de sauvegarde du Dataset.
            MonDataset.AcceptChanges
        End Sub
    Donc si vous m'avez bien suivi jusque là, j'ai 2 événements validating qui se produisent et la propriété hasChanges qui repasse à True après l'enregistrement.
    Je tourne en rond et je ne sais vraiment pas comment faire pour supprimer ce 2éme évènement ainsi que la modification indésirable de hasChanges.

    C'est chaud comme problème, je vous l'accorde mais je me traîne cette casserole depuis le début et j'ai pour ainsi dire terminé mon programme à part ça alors si vous pouvez m'aider ça serait super.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    A priori l'évenement validating et validated ne sont pas une bonne solution selon moi. En effet la validation du contrôle ne garanti pas une modification de ce dernier (perdre le focus suffit pour lancer une validation).

    Essaye de regarder du coté de OnPropertyChanged pour la propriété RTF du contrôle après son chargement.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour et merci de m'aider, j'ai fait une erreur en disant que j'avais supprimer le binding, il existe toujours mais paramétré en mode DataSourceUpdateMode.Never comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BindRichTextBox = New Binding("Rtf", BindingSourceTaches, TableTaches.MESSAGE, True, DataSourceUpdateMode.Never)
    Je n'ai pas trop compris cette phrase
    En effet la validation du contrôle ne garanti pas une modification de ce dernier
    mais j'ai quand même essayé avec l’évènement LostFocus. Hélas le problème persiste et j'ai toujours la propriété HasChanges qui repasse à True après l'enregistrement. De plus j'ai des appels multiples de LostFocus que je n'ai pas vraiment cherché à régler je dois dire car c'est plutôt la propriété hasChanges qui me préoccupe, (et c'est en partie une des raisons qui m'a fait préféré Validating à la place de LostFocus).
    Voici le code que j'ai modifié pour m'adapter à l'evenement LostFocus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AddHandler RichTextBoxJmb1.RichTextBox.LostFocus, AddressOf EventRichTextBoxlostFocus
        Private Sub EventRichTextBoxLostFocus(ByVal sender As Object, ByVal e As System.EventArgs)
            BindRichTextBox.WriteValue()
            BindingSourceTaches.EndEdit()
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Private Sub Enregistrer()
            Me.Focus() ' Donne le focus a la feuille MDI principale et fait perdre le focus au controle RichTextBox ce qui permet d’exécuter un WriteValue juste avant l'enregistrement.
            Call SaveDataset()
        End Sub
    J'avoue que je ne sais vraiment pas comment m'en sortir.
    Moi qui suis convaincu que la qualité des outils de développement Microsoft, je vais finir par croire qu'il y a un bug dans le fonctionnement du RichTextBox.
    Ci vous avez d'autres idées...Je suis prêt à tout essayer pour venir à bout de ce problème.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Essaye de mettre un test vérifiant si la propriété rtf de ton richtextbox est égale au datarow.

    Si oui alors tu n'effectues pas ton writevalue et dans ce cas, il est fort peut probable que le haschange soit mis à true. Ou alors ton problème est ailleurs...

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour, J'avance grâce à vous. J'ai mis des tests de la propriété HasChanges un peu partout dans le code et j'ai constaté :
    hasChanges passe à True systématiquement après un EndEdit donc voilà se qui se passe dans l'ordre :
    - Je modifie manuellement le contenu de mon RichTextBox
    - puis je lance un enregistrement à partir du bouton
    - la procédure "enregistrer" provoque l'exécution des événements Validating ou LostFocus (grâce à frm.ValidateChildren ou me.focus)
    - J'obtient un Writevalue + un EndEdit, ma propriété hasChanges passe à True qui est le comportement normal cette fois ci.
    - L’exécution du code se poursuit avec un SaveDataset.
    - Le SaveDataset repasse HasChanges à False (c'est normal)
    - Et à partir de là les ennuis commencent : En sortie de ma procédure "enregistrer" l’évènement Validating se relance (c'est à ce moment là que hasChanges repasse à True, aprés le EndEdit); Donc ce qu'il faudrait c'est que je n'obtienne pas le second évènement Validating.

    Je ne comprends pas pourquoi j'ai 2 fois ce même évènement, vous avez une idée ?
    Je continue mes recherche, j'espère que je vais finir par trouver.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour sinople, vous aviez effectivement la réponse au problème, en effectuant un test sur le contenu du RichtextBox ça fonctionne bien mais je reste convaincu qu'il y a un problème avec ce contrôle qui ne fonctionne pas comme il devrait.
    J'ai par ailleurs trouvé un autre post qui parle du même problème que moi ici :
    http://www.hightechtalks.com/dotnet-...es-224538.html

    Voici donc la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub EventRichTextBoxValidating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) ' System.ComponentModel.CancelEventArgs
            ' Ecrire seulement si necessaire
            If BindingSourceTaches.Current(TableTaches.MESSAGE) = RichTextBoxJmb1.RichTextBox.Rtf Then Exit Sub
            BindRichTextBox.WriteValue()
            BindingSourceTaches.EndEdit()
        End Sub

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Disons que la propriété rtf du Richtextbox n'est à la base pas déclaré comme "bindable", en effet cette dernière n'apparaît pas dans la fenêtre des bindings du designer.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Oui, c'est dommage que Microsoft n'ai pas prévue cette possibilité, on peux pourtant Binder la propriété Rtf dans le code, en tout cas c'est la seul facon que j'ai trouvé pour pouvoir enregistrer du Texte enrichie dans ma base en utilisant les méthodes de DataBinding. Aprés il y a peut-être d'autres moyens que je ne connais pas. Il faudrait approfondir la question ou si quelqu'un connais une autre méthode ca serait interressant de la connaitre.
    mais mon problème est résolue, je suis bien content depuis le temps que je cherchais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/03/2010, 16h46
  2. Réponses: 2
    Dernier message: 31/07/2009, 15h00
  3. Problème de récupérations de valeurs d'une base de données vers des jtextfields
    Par Dambrath dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 17/03/2009, 17h39
  4. Problème de droit à l'ouverture d'une base de données
    Par Nnsoft dans le forum Sécurité
    Réponses: 4
    Dernier message: 13/08/2007, 12h55
  5. Problème d'affichage de date dans une base de donnée
    Par Gouyon dans le forum C++Builder
    Réponses: 7
    Dernier message: 11/04/2007, 08h57

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