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

C# Discussion :

Limite contrôles utilisateurs


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Par défaut Limite contrôles utilisateurs
    Bonjour

    Je cherche une solution à la limite des contrôles utilisateurs.

    J'ai créé un contrôle utilisateur contenant une dizaine de labels, qui forment donc 1 seul contrôle utilisateur à ajouter dans ma Winform.

    Problème je reçois l'erreur suivante : L'exception Win32Exception n'a pas été gérée par le code utilisateur. Erreur lors de la création d'un handle de fenêtre sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pnlListe.Controls.Add(ucOperation);
    Après plusieurs essais, je peux vous affirmer que j'obtiens cette erreur lors que je génère plus de 711 contrôles utilisateurs (711 ça fonctionne 712 j'obtiens l'erreur).

    Il y a une limite ? Que peut-on faire pour parer à ce problème ?

    Merci.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    oui il y a des limits, et cette exception correspond aux object user, il me semble que la limit c'est 10000, tu peux savoir ou tu en est dans le gestionnaire de tache.
    Pour ne plus la rencontrer il faut bien disposer ces éléments, être sur qu'aucune référence ne pointe encore dessus...

    Généralement je rencontrais cette exception sur des applis pas très propre, au bout d'un certain temps d'utilisation. La je trouve tout de même bien rapide de l'avoir pour 711 controls, mais je trouve également étrange de vouloir mettre plus de 700 controls sur un écran... tu dois sans doute avoir de bonnes raisons. Dis nous en plus sur ton projet peut être pourront nous t'aider à contourner le problème.

    Bon code,
    J@ck.

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Par défaut
    Bonjour J@ckHerror

    Merci beaucoup pour ta réponse.

    Comment savoir ou j'en suis dans le gestionnaire des tâches ? Merci.

    Être sûr qu'aucune référence ne pointe encore dessus, c'est à dire ?

    L'appli me semble propre, peut-être que ma façon de voir le programme n'est pas la bonne.

    Mon projet : j'ai une liste dans SQL avec plusieurs informations dans une table : Numéro | Classe | Temps | Charge | etc...

    Mon but est de formater joliment ces données pour ne pas les afficher en mode "Excel". J'ai donc créé un contrôle utilisateur dans lequel j'ai inséré des labels : Numéro, Classe, Temps, Charge que j'ai joliment placé, avec des couleurs, selon les temps, retard avance ou autre.

    Ensuite, dans mon programme principal : je fais un select sur ma table et j'instancie mon contrôle utilisateur autant de fois que j'ai de ligne dans ma table et ça donne une jolie liste avec des bloques et toutes les infos ! J'espère avoir été assez clair.

    Merci.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par Fellerson Voir le message
    Ensuite, dans mon programme principal : je fais un select sur ma table et j'instancie mon contrôle utilisateur autant de fois que j'ai de ligne dans ma table et ça donne une jolie liste avec des bloques et toutes les infos ! J'espère avoir été assez clair.
    Tu pourrais commencer par n'instancier que ce que tu affiches. Admettons que, à un instant t, tu n'affiches que 10 contrôles utilisateur, alors n'en créé pas plus. Tu peux juste modifier les informations que tu affiches dans ceux-ci (lorsque tu scroll par exemple).

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2017
    Messages : 71
    Par défaut
    Bonjour ZenZiTone

    Merci pour ta réponse !

    Je créé autant de contrôles utilisateurs que de ligne dans ma requête. Si ma table me retourne 10 lignes : 10 blocs (contrôles utilisateur) si elle m'en retourne 700 par contre, 700 blocs.

    La solution me plait bien. Je n'ai malheureusement aucun background sur ce procédé, aucune expérience je ne sais pas du tout comment m'y prendre.

    Peut-être peux-tu m'aider ?

    Merci.

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Citation Envoyé par Fellerson Voir le message
    Comment savoir ou j'en suis dans le gestionnaire des tâches ? Merci.
    Je te disais cela juste pour que tu puisse vérifier que c'est bien ça le problème. Tu lance ton gestionnaire de taches (Ctrl + Alt + Suppr) puis dans Détails tu peux faire un clique droit sur les colonnes pour choisir les colonne affichées, choisit Handle et Object User. Lance ton applis et tu devrais voir les handle arriver à 9999 avant de planter.

    si tu as un user control qui contient 10 éléments (label, textBox, panel ...etc) et que tu en génères 700, alors tu auras consommé 7000 handles...

    Un lien intéressant.

    Pour résoudre ton soucis, je dirais qu'il faut que tu crée une classe qui représente une ligne de ta base de donnée et donc comme propriété => Numéro | Classe | Temps | Charge | etc...
    puis tu lis ta table, tu instancie autant d'object que de ligne retournée. Tu les mets tous dans une liste ou un dictionnaire. Ainsi tu as toutes tes lignes, toutes tes infos a dispo dans le programme, mais tu n'as toujours pas consommé un seul handle.
    Maintenant tu affiche par exemple 10 usercontrol et suivant ce que l'utilisateur veut (filtre sur le temps, la charge ... etc à toi de voir) tu prends les objects correspondant et tu les donne au usercontrol.

    Maintenant je suis conscient que je te donne cela un peu brut de pomme mais je n'ai pas le temps de te faire un petit exemple.

    J@ck.

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par Fellerson Voir le message
    La solution me plait bien. Je n'ai malheureusement aucun background sur ce procédé, aucune expérience je ne sais pas du tout comment m'y prendre.

    Peut-être peux-tu m'aider ?
    Pour essayer de te guider :

    Tu places les contrôles que tu vas afficher sur ton formulaire. Ainsi, tes contrôles sont créé et tu ne devra plus en créer par la suite. Là où ça se complique, c'est comment interfacer tes données avec ton affichage.

    Pour simplifier les choses je te conseille de créer une classe contenant les propriétés que tu souhaites manipuler dans ton contrôle utilisateur. Il contiendrait les propriétés Numéro, Classe, Temps, Charge, et les autres que tu affiches. Je ne connais pas la valeur métier de ce que tu souhaites afficher, mais pour la suite de l'explication, appelons cette classe "MaClasse"

    De là, tu pourras ajouter une méthode "Afficher" (par exemple) dans ton contrôle utilisateur, prenant en paramètre un objet de type "MaClasse", pour modifier l'objet affiché dans ton contrôle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void Afficher(MaClasse monObjet)
    {
        //Ici, tu affectes tes labels et ta mise en forme en fonction de 'monObjet'
    }
    Là, a priori, on est capable d'afficher n'importe quel objet de type "MaClasse" dans ton contrôle utilisateur. Il s'agit donc, ensuite, de lui fournir les bonnes valeurs. Pour cela, il faudra que, pour chaque ligne du résultat de la requête, tu créés un objet de type MaClasse. Ainsi, dans ton formulaire, tu auras une liste de "MaClasse". Pour simplifier, là où tu créais un contrôle utilisateur, tu devras créer un objet "MaClasse", que tu ajouteras dans une liste.

    Dernière étape, faire matcher ta liste avec ce que tu affiches. Plusieurs options sont possibles. J'ai pas le temps tout de suite d'expliquer plus, je verrais ce soir.

Discussions similaires

  1. Tests unitaires avec vbUnit sur des contrôles utilisateurs
    Par Patrick Mortas dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 07/09/2006, 18h06
  2. Réponses: 2
    Dernier message: 20/04/2006, 14h05
  3. [C#][VS2005]Contrôle utilisateur et saisie TextBox
    Par caelum dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/04/2006, 21h24
  4. [JSlider] Limiter l'utilisateur à un intervalle donné
    Par barbu0055 dans le forum Composants
    Réponses: 7
    Dernier message: 25/08/2005, 18h42

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