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

InfoPath .NET Discussion :

Performance Grand tableau extensible [IP-2007]


Sujet :

InfoPath .NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Developpeur Consultant
    Inscrit en
    Mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Performance Grand tableau extensible
    Bonjour,

    Je commence un projet en InfoPath, j'ai deja fait quelques formulaires avec du code C# derriére.

    Voici mon problème:
    J'ai fait un formulaire avec un tableau extensible de 16 colonnes.
    En dessous j'ai placé un bouton pour inserer plusieurs lignes en une seule fois :
    une MessageBox apparait pour communiquer avec l'utilisateur.
    Si l'utilisateur demande 100 lignes ca va, mais au dela ca rame, et ca fini par planter (test avec 1000 lignes).
    Est ce qu'infoPath peut supporter des tableaux aussi grands?

    Je precise que dans chaque case du tableau il y a une zone de texte.
    J'ai bien desactivé le rafraichissement pendant l'insertion des lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.CurrentView.DisableAutoUpdate();
    this.CurrentView.EnableAutoUpdate();
    Merci,

    Thomas

  2. #2
    Membre éprouvé
    Homme Profil pro
    Référent technique
    Inscrit en
    Juillet 2007
    Messages
    834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Référent technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 834
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    En effet, votre code est bon.
    J'ai déja réalisé ce genre de gros formulaires dans le temps, et j'ai été confronté à ce genre de problèmatique.

    Permetttez moi de vous poser ces quelques questions:
    • Insérez vous les lignes en une seule fois dans la structure extensible (à la fin) ou à chaque ligne? J'opterai pour la première solution qui sollicite moins les ressources.
    • Avez vous des mises en forme conditionnelle sur les champs de votre structure extensible? Si oui attention car ceci dégrade vraiment les performances.
    En fait il s'agit plus souvent d'une histoire de rendu. La mise en forme prend parfois du temps et il est nécessaire de commencer par un formulaire de base (que des zones de texte sans mises en forme conditionnelle).

    Vous pouvez aussi par exemple simuler un pagineur et rajoutant un champ masqué prenant le numéro de votre page.

    Cordialement.
    Rémi MATAYRON
    N'hésitez pas à visiter mon blog dédié à InfoPath et SharePoint : http://rmatayron.blogspot.com/

    Pour plus de visibilité sur le forum, marquer la question en [Résolu] lorsque la réponse fournie vous convient.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Developpeur Consultant
    Inscrit en
    Mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Merci pour votre réponse.

    Je rajoute ligne par ligne avec une boucle for:
    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
     
    'recupération du nombre de ligne à inserer dans l'int : nbLigne
    this.CurrentView.DisableAutoUpdate();
     
    XPathNavigator nav = MainDataSource.CreateNavigator();
    XPathNavigator monGroupe = nav.SelectSingleNode("/my:mesChamps/my:groupe1/my:groupe2", NamespaceManager);
    XPathNavigator monElement = nav.SelectSingleNode("/my:mesChamps/my:groupe1/my:groupe2/my:groupe3", NamespaceManager);
    XPathNavigator nouvelElement;
     
    for (int i = 0; i < nbLigne; i++)
    	{
                    nouvelElement = monElement.Clone();
    		monGroupe.AppendChild(nouvelElement);
    	}
    'en mode debug, ça met deja beaucoup de temps pour arriver la, mais c'est la commande suivante qui prend trop de temps :
    this.CurrentView.EnableAutoUpdate();

    Je n'ai pas de mise en page spécifique, il y a tout de même une info-bulle sur chaque zone de texte pour rappeler le titre de chaque colonne. J'ai lu qu'avec une zone de defilement, les performances seraient encore pires.


    Je n'ai pas compris votre suggestion de simuler un pagineur (mais ca m'interresse d'autant que j'ai des contraintes d'impressions or les options d'en-tête et pied-de-page sont assez limitées)

  4. #4
    Membre éprouvé
    Homme Profil pro
    Référent technique
    Inscrit en
    Juillet 2007
    Messages
    834
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Référent technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 834
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Ok dans ce cas la, je ne penses pas que ce soit la mise en forme qui dégrade les performances.

    Je vous conseille donc en premier lieu de vous orienter vers une seule modification de la structure : Ne pas insérer à chaque tour de boucle mais insérer à la fin de votre boucle "for".

    Ensuite au niveau du pagineur, je proposais le principe d'afficher les éléments par paquets, un peu comme une pagination (par exemple 20 éléments par page) :
    • Réaliser une zone de liste déroulante peuplée avec le nombre de pages sur lesquelles sont réparties vos documents,
    • Réaliser un filtrer de votre tableau extensible (à condition que vous peuplieez un champ concernant le numéro de la ligne sur chaque ligne lors de l'insertion).
    Ainsi lors de la modification de la zone de liste déroulante des pages, vous pourrez ainsi changer d'éléments affichés dans votre tableau extensible.
    La vue se chargera beaucoup plus vite car moins d'éléments seront présentés.

    Attention : Cela ne vous facilitera pas spécialement vos impressions...
    Rémi MATAYRON
    N'hésitez pas à visiter mon blog dédié à InfoPath et SharePoint : http://rmatayron.blogspot.com/

    Pour plus de visibilité sur le forum, marquer la question en [Résolu] lorsque la réponse fournie vous convient.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Developpeur Consultant
    Inscrit en
    Mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    J'ai testé le systéme de pagination, ça fonctionne. Je peux inserer 1000 lignes dans un temps raisonnable. Et l'ouverture du formulaire est rapide (Contrairement a avant quand le formulaire affichait tout le tableau en une fois)
    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
     
                int nbLigne = 1000;'nombre de ligne que je souhaite inserer
                this.CurrentView.DisableAutoUpdate();
     
                XPathNavigator nav = MainDataSource.CreateNavigator();
                XPathNavigator monGroupe = nav.SelectSingleNode("/my:mesChamps/my:groupe1", NamespaceManager);
                XPathNavigator monElement = nav.SelectSingleNode("/my:mesChamps/my:groupe1/my:groupe2", NamespaceManager);
                XmlWriter xmlw = monGroupe.AppendChild();
     
                for (int i = 0; i < nbLigne; i++)
                {
                    xmlw.WriteNode(monElement, true);' cette opération x 1000 prend un temps raisonnable
                }
                xmlw.Close();'cette opération est assez rapide, c'est la que le formulaire.xml rajoute toutes les lignes
     
                'numérotation des lignes, pour permettre le systeme de pagination : 
                'cette opération prend un peu de temps mais c'est bien plus performant que de se servir des formules "fx" d'infoPath
                'par contre je vais devoir surveiller si l'utilisateur insere ou supprime une ligne au milieu...
                XPathNodeIterator monChampNumerotation = nav.Select("/my:mesChamps/my:groupe1/my:groupe2/my:champ131", NamespaceManager);
                int cpt = 0;
                while (monChampNumerotation.MoveNext())
                {
                    monChampNumerotation.Current.SetValue("" + ((cpt / 5) + 1));
                    'j'ai choisi de mettre 5 lignes par pages car mes lignes sont assez énormes
                    cpt++;
                }
     
                nav.SelectSingleNode("/my:mesChamps/my:champ129", NamespaceManager).SetValue("1");'je selectionne la page 1 par defaut
                this.CurrentView.EnableAutoUpdate();
    Je vais mettre une rerserve : Ce systeme de pagination n'est pas agreable pour l'utilisateur : ca lui impose de changer de page réguliérement. Surtout qu'il y a un petit delai pour passer d'une page à une autre.

    Je vais essayer de convaincre mon client de diviser se formulaire en formulaires plus petits, s'il refuse j'adopterai ce systéme de pagination.

    Reste le problème de l'impression: ce sera pour un autre post!

    Merci pour votre aide,

    Thomas

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

Discussions similaires

  1. grand tableau dans un petit div
    Par zais_ethael dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/03/2006, 14h12
  2. Question l'utilisation d'un grand tableau en JS
    Par steelidol dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/03/2006, 21h01
  3. Charger un grand tableau de données
    Par benj63 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/02/2006, 17h21
  4. decalage à gauche sur une tres grand tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/07/2005, 22h40
  5. Déclarer un (très) grand tableau?
    Par Cheos dans le forum C++
    Réponses: 8
    Dernier message: 17/02/2005, 17h43

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