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 :

[c#] organiser des controls dynamiquement


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 40
    Points : 24
    Points
    24
    Par défaut [c#] organiser des controls dynamiquement
    Bonjour,

    Je travaille actuellement avec le CompactFrameWork 3.5 et Visual Studio 2008, au développement d'une application qui affiche une carte et des points particuliers sur cette carte. Lorsqu'on clique sur un point, les informations le concernant doivent s'afficher dans une nouvelle fenêtre.

    La fenêtre d'affichage des informations se compose donc de labels, zones de texte, combobox, qui sont différents et contiennent des infos différentes selon le point sur lequel on appuie. (les infos sur les points sont prises dans une base de donnée, je ne sais pas combien il y en a à afficher, ni quel type d'info elles contiennent)

    J'espère avoir été claire jusqu'ici, parce que si le contexte n'est pas clair ça ne va pas être facile.

    Je voulais, pour atteindre ce but, commencer par ajouter uniquement des labels qui affichent les informations actuelles. J'ai donc utilisé ce code :

    Code c# : 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
    public partial class ObjectInfo : Form
        {
            public ObjectInfo(DataTable data) //<--- data : les données à afficher
            {
                InitializeComponent(); //<----- défini dans un fichier à part,
                                              //met en forme de tout le reste
                InitializeData(data);
            }
     
            private void InitializeData(DataTable data)
            {
                int nCol = data.Columns.Count;
                for (int i = 0; i < nCol; i++)
                {
                    DataColumn column = data.Columns[i];
                    Label att = new Label();
                    att.Text = column.ColumnName + " : ";
                    Label val = new Label();
                    val.Text = data.Rows[0].ItemArray.GetValue(i).ToString();
                    infoPanel.Controls.Add(att);
                    infoPanel.Controls.Add(val);
                        //^-------infoPanel, comme son nom l'indique, est un panel.
                        //             Il doit contenir toutes les informations à terme.
                }
            }
        }

    Seul le premier Label ajouté est visible. Les autres existent mais sont probablement cachés derrière lui.

    J'ai cherché un peu ce qui pouvait m'aider mais n'ai pas trouvé grand chose. Le StackPanel à la place du panel, à la rigueur, si j'ai bien comprit, met les éléments ajoutés les uns en dessous des autres, mais j'aurais besoin d'une confirmation et d'un exemple simple peut être.
    J'ai déjà essayé de le faire mais me suis trouvée confrontée à un détail qui me gêne : l'assembly des stackpanel est dans le dossier silverlight, c'est pas là que je vais d'habitude pour les chercher, je suis méfiante, je sais pas ce qu'est silverlight, je suis en compact framework, j'ai pas envie de faire une boulette en utilisant un truc que je ne devrais pas.


    Ou alors si vous aviez une autre idée, je suis un peu à sec là...

    Merci d'avance.

  2. #2
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 40
    Points : 24
    Points
    24
    Par défaut
    Devant l'absence de réponse je vais ajouter les résultats de mes tests d'aujourd'hui...

    voici ce que je veux afficher : (ce sont uniquement des données de test)

    nom : obj1
    x : 996558
    y : 6732631
    attribut : ex1

    avant ':' c'est le columnName et après c'est la valeur concernée.

    J'ai modifié le code ainsi :

    Code c# : 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
    private void InitializeData(DataTable data)
            {
                int nCol = data.Columns.Count;
                for (int i = 0; i < nCol; i++)
                {
                    DataColumn column = data.Columns[i];
     
                    Label att = new Label();
                    att.Text = column.ColumnName + " : ";
                    att.Font = new Font("courrier new", 10, FontStyle.Bold);
                    att.TextAlign = ContentAlignment.TopCenter;
                    att.Dock = DockStyle.Left;
     
                    Label val = new Label();
                    val.Text = data.Rows[0].ItemArray.GetValue(i).ToString();
                    att.TextAlign = ContentAlignment.TopCenter;
                    val.Dock = DockStyle.Right;
     
                    infoPanel.Controls.Add(att);
                    infoPanel.Controls.Add(val);
                }
            }

    Si je fais varier mon i de 0 à 1 pour n'afficher que le premier élément, j'ai bien
    "nom : obj1" qui s'affiche. Victory !

    Seulement en faisant la boucle telle qu'elle est là, ça ne fonctionne plus.

    voici ce que je sais gràce à un point d'arrêt :
    'nom :' est localisé en {300;0}
    'obj1' est localisé en {-160;0}
    'x :' est localisé en {200;0}
    '996558' est localisé en {-60;0}
    'y :' est localisé en {100;0}
    '6732631' est localisé en {40;0}
    'attribut :' est localisé en {0;0}
    'ex1' est localisé en {140;0}

    Comportement étrange je trouve...
    D'autant que du coup je vois y et sa valeur et que sa valeur se trouve à gauche.
    6732631 y :

    je suis toujours en quête de réponses.

  3. #3
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,

    comment veux tu disposer tout ce texte ? Comme tu l'as vu, les Label ont une propriété "Position", que tu peux affecter (par exemple) à (X + Y * i, Z), où (X,Z) est la position du premier label, et Y l'écartement entre deux labels.

    Si tu veux simplement l'afficher sur des lignes successives, un seul label suffit, un label peut être multiligne.

    Sinon, regarde du côté du TableLayoutPanel.
    ಠ_ಠ

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 40
    Points : 24
    Points
    24
    Par défaut
    "(les infos sur les points sont prises dans une base de donnée, je ne sais pas combien il y en a à afficher, ni quel type d'info elles contiennent)"

    Je ne sais pas combien il y a d'infos à afficher, je peux donc difficilement leur donner un X et un Y.

    "Je voulais, pour atteindre ce but, commencer par ajouter uniquement des labels qui affichent les informations actuelles."

    J'utilise pour l'instant des labels, mais à la fin j'aurais des labels, des combobox, des zones d'entrée de texte, et peut-être même des images. (ce qui diminue encore plus la possibilité d'utiliser des X et Y d'ailleurs...


    Du coup je vais jeter un oeil du côté du TableLayoutPanel et je reviens vous dire ce que ça donne.

    edit : eeeuh, je trouve pas le TableLayoutPanel dans windows.Forms
    Il semblerait que ça n'existe pas dans le compact framework ^^"

  5. #5
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Laraannain Voir le message
    "(les infos sur les points sont prises dans une base de donnée, je ne sais pas combien il y en a à afficher, ni quel type d'info elles contiennent)"

    Je ne sais pas combien il y a d'infos à afficher, je peux donc difficilement leur donner un X et un Y.
    Ben si
    Imagine que tu veuilles disposer tes labels les uns sous les autres.
    Imagine qu'un label a une hauteur de 20 pixels (à vérifier).
    Imagine que tu veuilles mettre le premier en Y = 150 (par exemple).
    Tu boucles sur tes labels, avec i de 0 à NbLabels, et tu positionnes chacun en Y = 150 + 20 * i.

    Et sinon, comme tu le disais initialement, le StackPanel peut faire l'affaire. Ton besoin est dynamique, mais pour mieux l'apréhender et voir comment il marche, crée une Form de test, colle un StackPanel dedans, mets des labels dedans, et tu verras comment ça se comporte.
    ಠ_ಠ

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 40
    Points : 24
    Points
    24
    Par défaut
    Quand j'ajoute la dll contenant le stackpanel je suis coincée : pas assez de mémoire.

    je vais essayer de gérer avec des X et Y, je donne mes résultats dèsque j'en ai.

    Merci encore

    edit :
    bien pour l'instant ça fonctionne, je ne note pas le sujet comme résolu tout de suite puisque ça fonctionne pour des labels et les situations particulières que je rencontrerais plus tard pourraient me poser de nouveaux problèmes.

    Merci beaucoup à toi !

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

Discussions similaires

  1. créer des control dynamiquement ?
    Par dimmu dans le forum ASP.NET
    Réponses: 4
    Dernier message: 10/05/2007, 10h47
  2. Réponses: 1
    Dernier message: 19/08/2006, 19h40
  3. Réponses: 2
    Dernier message: 02/08/2006, 23h54
  4. Réponses: 6
    Dernier message: 18/04/2005, 21h12

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