Modifier des valeurs dans un form

cs_s7even Messages postés 6 Date d'inscription dimanche 13 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009 - 13 déc. 2009 à 13:46
cs_s7even Messages postés 6 Date d'inscription dimanche 13 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009 - 15 déc. 2009 à 19:43
bonjour,

je sais pas si mon titre est clair mais je vois pas comment décrire mon problème qui pour vous sera très basic


Donc j'ai un form WindowsFormsApplication1 avec les 2 code principaux : Form1.cs
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}


et Program.cs
namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}


Dans mon Form1 j'ai un label avec un texte avec le tag : label1

Ce que j'aimerais faire c'est modifier le text du label a partir de mon program.cs . J'arrive a chercher des information dans le program.cs a partir du form mais j'arrive pas a trouver comment faire pour envoyer des informations au Form
J'ai le les message pour passer des variable d'un form a un autre mais ca ne m'a pas vraiment éclairé

serait-il possible d'avoir un exemple ? un simple label1.text = "blablabla" me suffira


merci d'avance

6 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
14 déc. 2009 à 10:17
Il suffit de garder une référence sur ton Form1 quand tu le crées.

Form1 monForm1 = new Form1();
Application.Run(monForm1);

monForm1.label1.Text = "blablabla";
// A condition que label1 soit public !



Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
cs_s7even Messages postés 6 Date d'inscription dimanche 13 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
14 déc. 2009 à 15:26
et pour rendre mon label public je vais dans designer.cs et je modifie le private System.Windows.Forms.Label label1 en public blablabla
si j'ai bien compris ??? :s
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
14 déc. 2009 à 15:50
Oui :
private System.Windows.Forms.Label label1;
=>
public System.Windows.Forms.Label label1;

Rappel sur les opérateurs de portée

private : on n'y a accès qu'à l'intérieur de la classe
protected : on n'y a accès qu'à l'intérieur de la classe ou d'une classe qui en hérite
internal : on n'y a accès qu'à l'intérieur de l'assembly (exe ou dll / projet)
public : on y a accès de partout !

Là c'est ta classe Program qui a besoin d'avoir accès à un membre de ta classe Form1, dans le même projet.
Donc les 2 portées qui fonctionnent sont public et internal.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
cs_s7even Messages postés 6 Date d'inscription dimanche 13 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
15 déc. 2009 à 00:52
alors alors ca marche (heureusement vous me direz :p)

mais , forcement y'en a un

j'ai accès a mon label quand dans le main()

en gros j'aimerais faire une copie de dossier, avec la barre de progression et le nom des fichiers

j'ai donc ce code qui copie les fichiers

        public static void Copie_rep(string rep_source, string rep_dest)
        {
            try
            { 
                DirectoryInfo rep = new DirectoryInfo(rep_source);
                {
                    if (rep.Exists)
                    {
                        string vrai_rep_dest;
                        if (rep.Root.Name != rep.Name)
                        {
                            vrai_rep_dest = Path.Combine(rep_dest, rep.Name);
                            if (!Directory.Exists(vrai_rep_dest))
                            { Directory.CreateDirectory(vrai_rep_dest); }
                        }
                        else
                        { vrai_rep_dest = rep_dest; }
                        foreach (string d in Directory.GetDirectories(rep_source))
                            Copie_rep(d, vrai_rep_dest);
                        foreach (string fichier in Directory.GetFiles(rep_source))
                        {
                            
                            string fichier_dest = Path.Combine(vrai_rep_dest, Path.GetFileName(fichier));
                            
                            // Afficher le nom du fichier dans mon Form
                            f.label1.Text = Path.GetFileName(fichier);

                            File.Copy(fichier, fichier_dest, true); 
                        }
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show(s7_Progress.erreur.affiche_erreur(03), "Erreur ... ", MessageBoxButtons.OK, MessageBoxIcon.Error);                 
            }
        }


voila mon main
        public static void Main()
        {
            s7_Progress.config.Lecture_config(fichier_config);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Main_fenetre f = new Main_fenetre();
            Application.Run(f);
            
        }


j'apelle la copie via un bouton dans le form

        private void button_start_Click(object sender, EventArgs e)
        {
                s7_Progress.repertoire.Copie_rep(s7_Progress.Main_code.DVD, s7_Progress.Main_code.rep_Sources);
                MessageBox.Show("Copie finie", "copie", MessageBoxButtons.OK, MessageBoxIcon.None);
            
        }


mais il me dit que le label n'existe pas dans le contexte actuel
pour le moment j'ai pas encore codé la partie qui controle la barre de progression

est ce que je m'y prends mal ? y'a t il plus simple ou plus propre ?

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
15 déc. 2009 à 10:12
j'ai accès a mon label quand dans le main()

FAUX !! Tu n'a accès à ton form que dans le main. La variable qu'il ne connaît pas, c'est f.

Pour que ta méthode Copie_rep ait accès à ton label, tu as 2 solutions : soit tu fournis à la méthode la référence à ton label, soit tu lui fournis la référence à ton form.

1ere solution (label1 peut même être private dans ce cas):
//Dans button_start_Click()
s7_Progress.repertoire.Copie_rep(s7_Progress.Main_code.DVD, s7_Progress.Main_code.rep_Sources, label1);
//Prototype de ta méthode Copie_rep
public static void Copie_rep(string rep_source, string rep_dest, Label monLabel)
//Changement de la valeur
monLabel.Text = Path.GetFileName(fichier);


2eme solution (label1 doit être public ou internal)
//Dans button_start_Click()
s7_Progress.repertoire.Copie_rep(s7_Progress.Main_code.DVD, s7_Progress.Main_code.rep_Sources, this);
//Prototype de ta méthode Copie_rep
public static void Copie_rep(string rep_source, string rep_dest, Form1 monForm)
//Changement de la valeur
monForm.label1.Text = Path.GetFileName(fichier);


Tu auras aussi un problème lors de ta copie : l'affichage ne s'actualisera pas avant la fin de tes copies. Il suffit de rajouter la ligne Application.DoEvents(); après l'édition de ton label.

Cependant, une remarque, c'est que ton code n'est pas du tout orienté objet. De manière générale, le mot-clé static est à éviter tant que possible.

On serait plutôt enclins à avoir une classe qui serait par exemple nommée Copie_rep avec des propriétés Source et Destination, et une méthode Start_Copie() par exemple.
Et de plus, afin de garder une certaine indépendance entre cette classe et le reste de ton programme (afin, par exemple, de la réutiliser), il faudrait lancer la copie dans un thread différent (pour ne pas bloquer le programme pendant la copie) et créer une méthode Nom_fichier_actuel() (ou une propriété) afin de connaître le fichier en cours de copie. Tu pourrais même déclencher un événement à chaque nouveau fichier.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
cs_s7even Messages postés 6 Date d'inscription dimanche 13 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
15 déc. 2009 à 19:43
mh ... je sens que je vais encore tout recommencer

concernant la prog objet je suis autodidacte donc j'ai toujours bidouillé jusqu'à ce que ca marche mais j'ai l'intention de me mettre à programmer proprement, si si c'est vrai

pour les thread j'ai regardé un peu comment ca fonctionne mais je m'emmêle encore joyeusement dans les classes / méthodes et tout le bazar donc pour commencer je vais déjà me faire une copie de fichier propre et qui marche comme je veux

merci pour ta patience et tes explications
Rejoignez-nous