Meilleur auteur de réponses
Passage de variable entre frame

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
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
- Marqué comme réponse Marius Bugiulescu vendredi 11 septembre 2009 12:41
-
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
- Marqué comme réponse Marius Bugiulescu vendredi 11 septembre 2009 12:41
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
- Marqué comme réponse Marius Bugiulescu vendredi 11 septembre 2009 12:41
-
-
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
-
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
- Marqué comme réponse Marius Bugiulescu vendredi 11 septembre 2009 12:41
-