none
Passage de variable entre frame RRS feed

  • Question

  • Bonjour,

    sur une frame (fenêtre) je sélectionne une valeur par le biais d'une combo box

    je passe sur une autre frame suite à un click et je souhaite réccuperer cette valeur (dans la combobox) pour l'utiliser sur une autre frame

    mon code ne marche pas

    J'ai utilisé un delegate mais ça ne marche pas et je comprend pas

    ya til un moyen simple pour faire ce passage de paramètre

    MERCI


    jeudi 6 décembre 2007 18:51

Réponses

  • Bonjour,

     

    il y a 2 possibilités

    1) modifier le constructeur du 2ème formulaire en ajoutant un paramètre qui contiendra la valeur sélectionnée dans la combobox

    2) utiliser une classe public static ( ce qui permet de ne pas avoir à instancier cette classe )

    je suppose que le 1er formulaire s'appelle Form1 avec une combobox Cb1

    le 2ème formulaire correspond à la classe Form2 et est appelé dans le formulaire Form1 par

    Form Frm2 = new Form2();

    Frm2.ShowDialog();

     

    il suffit de remplacer la 1ère ligne par

    Form Frm2 = new Form2(Cb1.SelectedItem.ToString());

     

    dans la classe Form2,on modifie le constructeur

    public class Form2 :Form

    {

    public Form2()

    {

    InitializeComponent();

    }

    }

    modification à faire:

    public class Form2:Form

    {

    public String var;

     

    public Form2(String valeur)

    {

    InitializeComponent();

    var = valeur;

    }

    }

    maintenant, on peut utiliser la chaîne selectionnée dans Cb1 dans le 2ème formulaire par l'intermédiaire de var

     

    Cette méthode marche mais présente un inconvénient majeur : on peut modifier var , mais on ne peut pas simplement récupérer cette nouvelle valeur pour l'utiliser dans Form1

     

    J'utilise plutôt la méthode de la classe public static

    Je crée une classe public static Commun et à l'intérieur je déclare un champ public static avec getter/setter

     

    public static class Commun

    {

    private static String  _valeur;

    public static String Valeur

    {

    get

    {

    return _valeur;

    }

    set

    {

    _valeur = value;

    }

    }

    }

     

    dans la classe Form1

    Commun.Valeur = Cb1.SelectedItem.ToString();

    Form Frm2 = new Form2();

    Frm2.ShowDialog();

     

    On peut accéder à Valeur dans Form2 par Commun.Valeur

    On peut ainsi accéder en lecture/écriture à un champ défini dans la classe Commun dans n'importe quel formulaire.

    J'utilise ce style de programmation lorsque je dois récupérer des données "invariantes" comme l'heure de dernier

    redémarrage de windows ou le fait que l'utilisateur connecté soit administrateur de son poste.

    Je crée pour celà une fonction public static void Initialisation() dans la classe Commun où je charge ces valeurs .

    je fais un appel Commun.Initialisation() au tout début de l'application

    static class Program

    {

    /// <summary>

    /// Point d'entr‚e principal de l'application.

    /// </summary>

    [STAThread]

    static void Main()

    {

    Commun.Proc = Process.GetCurrentProcess();

    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(false);

    Commun.Initialisation();

    Application.Run(new Frm());

    }

    }

    ça marche, mais ce n'est pas "beau" ( je crée des variables "globales" , "shared" en VB) , mais c'est efficace et réutilisable dans d'autres projets

     

    Bonne soirée

     

    jeudi 6 décembre 2007 22:27
  • Rebonjour,

     

    je viens d'écrire un projet Windows avec VC# Express ( nom du projet  Test_Commun )

    je donne le code pour les 4 sources

    program.cs

    using System;

    using System.Collections.Generic;

    using System.Windows.Forms;

    namespace Test_Commun

    {

    static class Program

    {

    /// <summary>

    /// Point d'entr‚e principal de l'application.

    /// </summary>

    [STAThread]

    static void Main()

    {

    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(false);

    Commun.Initialisation();

    Application.Run(new Form1());

    }

    }

    }

     

    Commun.cs ( créé en ajouter nouvelle classe )

    using System;

    using System.Collections.Generic;

    using System.Text;

    namespace Test_Commun

    {

    public static class Commun

    {

    private static String _valeur;

    public static String Valeur

    {

    get

    {

    return _valeur;

    }

    set

    {

    _valeur = value;

    }

    }

    public static void Initialisation()

    {

    Valeur = "alpha";

    }

    }

    }

     

    Form1.cs ( 1er formulaire )

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    namespace Test_Commun

    {

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

    listBox1.Items.Add("Yvelines");

    listBox1.Items.Add("Val d'Oise");

    listBox1.Items.Add("Paris");

    listBox1.Items.Add("Hauts de Seine");

    label1.Text = Commun.Valeur;

    label4.Text = ""; // contiendra la nouvelle valeur de Commun.Valeur après retour de Form2

    }

    private void listBox1_SelectedValueChanged(object sender , EventArgs e)

    {

    Commun.Valeur = listBox1.SelectedItem.ToString();

    MessageBox.Show("Sélection :" + Commun.Valeur);

    Form Frm2 = new Form2();

    Frm2.ShowDialog();

    label4.Text = Commun.Valeur;

    }

    }

    }

     

    Form2.cs ( 2ème formulaire )

    label2 contient la valeur Commun.Valeur en entrée dans Form2 donc ce qui a été sélectionné dans listbox1 de Form1

    textbox1 sert à la saisie de la nouvelle valeur de Commun.Valeur

    après sortie de Form2, cette nouvelle valeur s'affichera dans label4 de Form1

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    namespace Test_Commun

    {

    public partial class Form2 : Form

    {

    public Form2()

    {

    InitializeComponent();

    label2.Text = Commun.Valeur;

    textBox1.Text = "";

    }

    private void Form2_FormClosing(object sender , FormClosingEventArgs e)

    {

    Commun.Valeur = textBox1.Text;

    }

    }

    }

     

    J'espère que ce post pourra vous aider

     

    Bonne journée

    vendredi 7 décembre 2007 07:03

Toutes les réponses

  • Bonjour,

     

    il y a 2 possibilités

    1) modifier le constructeur du 2ème formulaire en ajoutant un paramètre qui contiendra la valeur sélectionnée dans la combobox

    2) utiliser une classe public static ( ce qui permet de ne pas avoir à instancier cette classe )

    je suppose que le 1er formulaire s'appelle Form1 avec une combobox Cb1

    le 2ème formulaire correspond à la classe Form2 et est appelé dans le formulaire Form1 par

    Form Frm2 = new Form2();

    Frm2.ShowDialog();

     

    il suffit de remplacer la 1ère ligne par

    Form Frm2 = new Form2(Cb1.SelectedItem.ToString());

     

    dans la classe Form2,on modifie le constructeur

    public class Form2 :Form

    {

    public Form2()

    {

    InitializeComponent();

    }

    }

    modification à faire:

    public class Form2:Form

    {

    public String var;

     

    public Form2(String valeur)

    {

    InitializeComponent();

    var = valeur;

    }

    }

    maintenant, on peut utiliser la chaîne selectionnée dans Cb1 dans le 2ème formulaire par l'intermédiaire de var

     

    Cette méthode marche mais présente un inconvénient majeur : on peut modifier var , mais on ne peut pas simplement récupérer cette nouvelle valeur pour l'utiliser dans Form1

     

    J'utilise plutôt la méthode de la classe public static

    Je crée une classe public static Commun et à l'intérieur je déclare un champ public static avec getter/setter

     

    public static class Commun

    {

    private static String  _valeur;

    public static String Valeur

    {

    get

    {

    return _valeur;

    }

    set

    {

    _valeur = value;

    }

    }

    }

     

    dans la classe Form1

    Commun.Valeur = Cb1.SelectedItem.ToString();

    Form Frm2 = new Form2();

    Frm2.ShowDialog();

     

    On peut accéder à Valeur dans Form2 par Commun.Valeur

    On peut ainsi accéder en lecture/écriture à un champ défini dans la classe Commun dans n'importe quel formulaire.

    J'utilise ce style de programmation lorsque je dois récupérer des données "invariantes" comme l'heure de dernier

    redémarrage de windows ou le fait que l'utilisateur connecté soit administrateur de son poste.

    Je crée pour celà une fonction public static void Initialisation() dans la classe Commun où je charge ces valeurs .

    je fais un appel Commun.Initialisation() au tout début de l'application

    static class Program

    {

    /// <summary>

    /// Point d'entr‚e principal de l'application.

    /// </summary>

    [STAThread]

    static void Main()

    {

    Commun.Proc = Process.GetCurrentProcess();

    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(false);

    Commun.Initialisation();

    Application.Run(new Frm());

    }

    }

    ça marche, mais ce n'est pas "beau" ( je crée des variables "globales" , "shared" en VB) , mais c'est efficace et réutilisable dans d'autres projets

     

    Bonne soirée

     

    jeudi 6 décembre 2007 22:27
  • En mettant la mm chose que ton code,

    mon programme bug à ce niveau

    public static class Commun

     Le modificateur 'static' n'est pas valide pour cet élément

    il aime pas static ???
    jeudi 6 décembre 2007 23:42
  • Bonjour,

     

    je viens d'écrire un petit bout de code que j'ai testé:

    namespace Test_Static

    {

    class Program

    {

    static void Main(string[] args)

    {

    Commun.Initialisation();

    Console.WriteLine("Administrateur du poste : {0}",Commun.Admin.ToString());

    }

    }

    public static class Commun

    {

    private static Boolean _admin;

    public static Boolean Admin

    {

    get

    {

    return _admin;

    }

    set

    {

    _admin = value;

    }

    }

    public static void Initialisation()

    {

    _admin = false;

    WindowsIdentity wi = WindowsIdentity.GetCurrent();

    WindowsPrincipal wp = new WindowsPrincipal(wi);

    if ( wp.IsInRole(WindowsBuiltInRole.Administrator) )

    {

    Admin = true;

    }

    if ( wp.IsInRole(WindowsBuiltInRole.SystemOperator) )

    {

    Admin = true;

    }

    }

    }

    }

     

    j'obtiens :

    Administrateur du poste : True
    Appuyez sur une touche pour continuer...

     

    J'ai écrit pour un programme Console car c'est plus rapide

    pourriez-vous poster votre code de la classe public static ?

     

    Bonne journée

    vendredi 7 décembre 2007 06:15
  • Rebonjour,

     

    je viens d'écrire un projet Windows avec VC# Express ( nom du projet  Test_Commun )

    je donne le code pour les 4 sources

    program.cs

    using System;

    using System.Collections.Generic;

    using System.Windows.Forms;

    namespace Test_Commun

    {

    static class Program

    {

    /// <summary>

    /// Point d'entr‚e principal de l'application.

    /// </summary>

    [STAThread]

    static void Main()

    {

    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(false);

    Commun.Initialisation();

    Application.Run(new Form1());

    }

    }

    }

     

    Commun.cs ( créé en ajouter nouvelle classe )

    using System;

    using System.Collections.Generic;

    using System.Text;

    namespace Test_Commun

    {

    public static class Commun

    {

    private static String _valeur;

    public static String Valeur

    {

    get

    {

    return _valeur;

    }

    set

    {

    _valeur = value;

    }

    }

    public static void Initialisation()

    {

    Valeur = "alpha";

    }

    }

    }

     

    Form1.cs ( 1er formulaire )

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    namespace Test_Commun

    {

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

    listBox1.Items.Add("Yvelines");

    listBox1.Items.Add("Val d'Oise");

    listBox1.Items.Add("Paris");

    listBox1.Items.Add("Hauts de Seine");

    label1.Text = Commun.Valeur;

    label4.Text = ""; // contiendra la nouvelle valeur de Commun.Valeur après retour de Form2

    }

    private void listBox1_SelectedValueChanged(object sender , EventArgs e)

    {

    Commun.Valeur = listBox1.SelectedItem.ToString();

    MessageBox.Show("Sélection :" + Commun.Valeur);

    Form Frm2 = new Form2();

    Frm2.ShowDialog();

    label4.Text = Commun.Valeur;

    }

    }

    }

     

    Form2.cs ( 2ème formulaire )

    label2 contient la valeur Commun.Valeur en entrée dans Form2 donc ce qui a été sélectionné dans listbox1 de Form1

    textbox1 sert à la saisie de la nouvelle valeur de Commun.Valeur

    après sortie de Form2, cette nouvelle valeur s'affichera dans label4 de Form1

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    namespace Test_Commun

    {

    public partial class Form2 : Form

    {

    public Form2()

    {

    InitializeComponent();

    label2.Text = Commun.Valeur;

    textBox1.Text = "";

    }

    private void Form2_FormClosing(object sender , FormClosingEventArgs e)

    {

    Commun.Valeur = textBox1.Text;

    }

    }

    }

     

    J'espère que ce post pourra vous aider

     

    Bonne journée

    vendredi 7 décembre 2007 07:03
  • Désolé pour les multiples envois mais j'ai eu des gros problèmes avec mon internet qui ne réagissait plus

    Bonne journée

    vendredi 7 décembre 2007 07:07