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

Framework .NET Discussion :

[.NET 2.0 Binding] Lenteur avec du binding complexe et combobox qui n'update rien


Sujet :

Framework .NET

  1. #1
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut [.NET 2.0 Binding] Lenteur avec du binding complexe et combobox qui n'update rien
    J'ai une form comportant un databinding assez complexe (5 bindingsource, 3 datagridview, 1 bindingnavigator.... et 1 combobox qui emmerde le peuple).

    Alors, tout ceci est connecté à des objets métier de mon cru, qui récupèrent de manière déconnectée - c'est à dire pas de lazy loading, simplement parce que c'est pas applicable dans mon cas - mes données depuis une base PostgreSQL 8.2x avec le connecteur Npgsql (ADO.NET).

    J'ai deux soucis avec tout ce bazar actuellement.

    Mon premier souci est cette foutue combobox qui n'update pas l'objet métier auquel elle est liée quand je change l'item sélectionné. (D'après ce que j'ai pu lire, cela est dû au fait que "grâce" à l'interface INotifyPropertyChanged, cette combobox réécrit sa propre valeur depuis l'objet métier avant de modifier la valeur de l'objet métier. Du coup, ça n'a aucun effet.... -_-... supair...)
    Si quelqu'un a une solution propre qui ne nécessite pas de dériver une classe "NotityPropertyChangedFixedComboBox" de la classe ComboBox, je suis preneur.

    Mon second souci, qui m'ennuie davantage, je dois bien l'avouer, c'est que tout ce databinding est lent au chargement.
    En effet, dès que je charge quelque chose, je vais le chercher dans la base de donnée (située sur un serveur dans le réseau local, c'est même pas une requête locale quoi...), ce qui est le comportement normal, vous me direz.
    Oui, sauf que là, le databinding de microsoft se met en route même quand cela n'est pas nécessaire.
    Du coup je me retrouve avec facilement une au moins demi-douzaine d'appels à la même requête SELECT...

    Y a-t-il un moyen de limiter ce comportement à une seule requête SELECT par contrôle au moins ?

    D'une manière générale, que pensez-vous du databinding et du "design-time databinding" ?

  2. #2
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonsoir,

    et oui c'est assez chiant ce problème avec le combobox.
    Ce que j'ai fait (ce n'est pas forcément la meilleur solution), c'est d'utiliser l'évenement PositionChanged du BindingSource lié au combobox. En cas de modification de la position, je récupère l'élément current à modifier et j'assigne la valeur comboBox.SelectedValue à la propriété correspondante.

    Oui, sauf que là, le databinding de microsoft se met en route même quand cela n'est pas nécessaire.
    Si j'ai bien compris ce que tu entends par là, ce que tu peux faire c'est te désabonner des différents evenements de notifications du bindingsource lors de l'initialisation et te réabonner après l'initialisation.

    Bye.

  3. #3
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    En fait le second souci est plus ou moins résolu.
    Cela était dû à la combobox également. Apparemment, la combobox (ainsi que la listbox, du coup) est un contrôle assez mal foutu qui a pas mal de soucis avec le databinding.
    J'ai résolu ce problème en bindant le combobox manuellement. Pas vraiment aussi génial que ce que j'aurais voulu, mais bon...

    Sinon, le 1er souci, c'est justement le genre de manip que j'aimerais éviter, en fait.

  4. #4
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    cela est dû au fait que "grâce" à l'interface INotifyPropertyChanged, cette combobox réécrit sa propre valeur depuis l'objet métier avant de modifier la valeur de l'objet métier.
    pourrais-tu me filer le lien où tu as lu ceci ?

    Sinon, le 1er souci, c'est justement le genre de manip que j'aimerais éviter, en fait.
    Oui moi aussi j'aimerais bien éviter ça.

    Je viens de refaire un essai, et ça a l'air de fonctionner tout compte fait.
    Voici comment j'ai fait:
    J'utilise un DataSet dans lequel il y a une DataTable de commandes et une autre DataTable d'états de la commande.
    La DataTable Commande comporte les propriétés suivantes:

    IdCde (Identifiant de la commande)
    ReferenceCde (Référence de la commande)
    EtatCdeCode (Code de l'état de la commande)
    La DataTable Etats de la commande comporte les propriétés suivantes:

    EtatCdeCode (Code de l'état de la commande)
    EtatCdeLibelle (Libellé de l'état de la commande)

    J'utilise un BindingSource nommé commandeBindingSource définit comme suit:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    commandeBindingSource.DataSource = myDataSet;
    commandeBindingSource.DataMember = "Commande";

    J'utilise un autre BindingSource nommé etatCommandeBindingSource définit comme suit:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    etatCommandeBindingSource.DataSource = myDataSet;
    etatCommandeBindingSource.DataMember = "EtatCommande";

    J'ai lié des textbox à commandeBindingSource et un combobox de la manière suivante:

    Sous VS2005, dans le concepteur, je clique sur la petite flèche situé en haut à droite du combobox.
    Apparaît alors un menu permettant de configurer la liaison:

    dans source de données, je choisi etatCommandeBindingSource.
    dans "Afficher le membre", je choisi EtatCdeLibelle.
    dans "Membre Value", je choisi EtatCdeCode
    dans "Valeur sélectionnée", je choisi commandeBindingSource - EtatCdeCode.
    J'ai essayé et ça fonctionne. Si je sélectionne une autre valeur dans le combobox, la propriété de la ligne courant du DataTable commande est modifiée.

    Bye.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/04/2008, 17h21
  2. Fichier Xml n'est pas remis à jour avec le binding XmlDataProvider
    Par amandinerenard dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 29/02/2008, 14h45
  3. binding Textbox avec db sql
    Par thierry007 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 03/10/2007, 11h27
  4. Réponses: 4
    Dernier message: 27/12/2006, 16h47
  5. Réponses: 2
    Dernier message: 21/08/2006, 21h27

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