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 :

Nouveau contrôle à modifier


Sujet :

Windows Forms

  1. #1
    Membre expert
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 616
    Points : 3 063
    Points
    3 063
    Par défaut Nouveau contrôle à modifier
    Bonjour tout le monde,

    Quand on ajoute par code un contrôle à un formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Label label1 = new Label();
    label1.Text = "_";
    label1.Left = left;
    label1.Top = top;
    F.Controls.Add(label1);
    (F de type Form1)

    est-ce qu'il est possible de préciser son modificateur d'accès, pour le cas où on voudrait accéder plusieurs fois à cette modification ?

    Par défaut le contrôle est créé private, donc ça risque de coincer pour le modifier ensuite depuis un autre formulaire.

    *

    Autre approche ...
    Avec ceci je m'attends à supprimer les boutons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach (Control C in F.Controls)
    {
    	if (C is Button)
    	{
    		F.Controls.Remove(C);
     
    	}
    }
    F.Refresh();
    Ils disparaissent bien de l'affichage du formulaire, mais pas de la collection Controls. Donc ça me donne l'impression que ce n'est pas du travail propre.
    Donc j'ai remplacé par
    d'où la nécessité de remettre l'étiquette.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 684
    Points : 1 190
    Points
    1 190
    Par défaut
    Bonjour,
    pour la seconde question, est-ce-que l'apport de Dispose change quelque chose ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                foreach (Control C in F.Controls)
                {
                    if (C is Button)
                    {
                        F.Controls.Remove(C);
                        C.Dispose();
                    }
                }
    ou la méthode de la boucle inversée apporte-elle une solution ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                for (int i = F.Controls.Count - 1; i >= 0; i--)
                {
                    if (F.Controls[i] is Button)
                    {
                        F.Controls.RemoveAt(i);
                    }
                }

  3. #3
    Membre expert
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 616
    Points : 3 063
    Points
    3 063
    Par défaut
    Bonjour,

    En le lisant j'ai eu l'impression que Dispose était une idée géniale.

    Malheureusement le résultat n'a pas été à la hauteur des espérances.

    En revanche je dois dire que la boucle inverse a une efficacité spectaculaire.

    Le nombre de contrôles restants à la fin correspond bien à ce à quoi je m'attends, alors qu'avant ça tapait souvent à côté.

    Merci.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 294
    Points : 12 535
    Points
    12 535
    Par défaut
    Par défaut le contrôle est créé private, donc ça risque de coincer pour le modifier ensuite depuis un autre formulaire.
    Déjà que pour un contrôle "statique", utiliser autre chose que private ou protected, c'est une hérésie au niveau POO, pour un contrôle "dynamique" ça n'a aucun putain de sens.

    Avec ceci je m'attends à supprimer les boutons :
    Vos boutons sont "statiques" (des champs du formulaires) ou "dynamiques" ?
    Si c'est des boutons "statiques", votre code n'a aucun sens.

    Si c'est des boutons "dynamiques", je ne vous pas où est le "problème".
    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
            private void button1_Click(object sender, EventArgs e)
            {
                Label label1 = new Label();
                label1.Text = "_";
                label1.Left = 0;
                label1.Top = 0;
                this.Controls.Add(label1);
            }
    private void button2_Click(object sender, EventArgs e)
    {
        foreach( var con in Controls)
        {
            if(con is Label && ((Label)con).Text == "_")
            {
                this.Controls.Remove((Label)con);
            }
        }
    }
    Le ramasse-miette s'occupe directement d'appeler les "Dispose" qui vont bien.

    C'est quoi votre "problème" initial ?
    Vous avez un dépôt Git avec un projet minimal qui reproduit votre problème ?

  5. #5
    Membre expert
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 616
    Points : 3 063
    Points
    3 063
    Par défaut
    Les boutons ne se supprimaient pas bien, Chrismonoye a bien trouvé la solution.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 294
    Points : 12 535
    Points
    12 535
    Par défaut
    Ça fonctionne aussi très bien avec des boutons dynamiques:
    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
    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = "Toto";
     
        Button button1 = new Button();
        button1.Text = "_";
        button1.Left = 0;
        button1.Top = 0;
        this.Controls.Add(button1);
    }
     
    private void button2_Click(object sender, EventArgs e)
    {
        foreach( var con in Controls)
        {
            if(con is Button && ((Button)con).Text == "_")
            {
                this.Controls.Remove((Button)con);
            }
        }
    }
    Appelez "Dispose" à la main, c'est une très mauvaise idée.

    Il y a vraisemblablement des références vers vos boutons qui empêche le ramasse-miettes (garbage-collector) de faire correctement son œuvre.

    Je pense que votre conception doit avoir un trou dans la raquette.

  7. #7
    Membre expert
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 616
    Points : 3 063
    Points
    3 063
    Par défaut
    Il y a une étiquette et une case à cocher qui sont en fixe, mais tout le reste, c'est uniquement des boutons dynamiques, créés d'après la chaîne de caractères fournie en paramètres.

    Tout fonctionne bien.
    Pour le moment ça envoie le caractère choisi dans le presse-papier.

    Plus tard, peut-être que j'évaluerai la fenêtre active pour y envoyer le caractère.

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

Discussions similaires

  1. Modifier le menu nouveau du clic droit
    Par yoyozaza dans le forum Windows 10
    Réponses: 2
    Dernier message: 09/04/2017, 00h02
  2. [XL-2007] VBA Bouton modifier, nouveau, facturation et variables sur différents userforms
    Par melreb dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/12/2016, 16h17
  3. Réponses: 5
    Dernier message: 24/08/2016, 22h29
  4. Réponses: 3
    Dernier message: 24/10/2012, 14h01
  5. [SP-2007] Modifier le bouton "Nouveau" d'une liste
    Par merlin73 dans le forum SharePoint
    Réponses: 2
    Dernier message: 08/06/2010, 16h02

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