Passage de variable

Résolu
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 - 11 juin 2012 à 10:16
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 - 12 juin 2012 à 12:40
Salut salut !

Alors, je sais qu'il y a beaucoup de post qui en parle sur le forum et que y'en a un qui viens juste d'être mit avant moi, mais je pense que c'est un peu différent et j'aimerais aussi comprendre ce que je fais.

en faite , d'habitude je passe mais variable d'une form a l'autre comme ceci :

        public string nom()
        {
            string sNm = "x";
            return sNm;
        }


maintenant je vous explique ma situation :

j'ai sur une form1 , un datagridview qui n'est pas forcément afficher (selon l'action de l'utilisateur) et une form2 qui permet a l'utilisateur de filtrer le datagridview.

Ce que j'aimerai donc , c'est qu'au moment ou l'utilisateur appuie sur le boutton de la form2, la datagridview de la form1 se lance avec le filtre.
Mais sous cette forme :

        public string nom(variable)
        {
            string sNm = "x";
            return sNm;
        }


forcement ça marche pas très bien, alors j'ai lu des choses avec des référence ?? compliqué ! et regarder le code qu'avais posté Bidou qui parle de ce sujet.
Mais si une âme charitable pouvait me donné une coup de pouce avec une toute petite explication.
Merci d'avance.

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas

9 réponses

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
11 juin 2012 à 17:24
Petite omission de ma part, il faut faire un cast sauvage en Form1, car Owner est de type Form ;)
((Form1)this.Owner).FiltreMonDataGrid(rbtnlChoices.SelectedValue, txtValue.Text);
3
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
11 juin 2012 à 11:20
Salut,

Déjà, le code que tu mets ne respecte pas du tout les conventions de nommage.
En C#, le nom des méthodes commence par une majuscule, et est censé commencer par un verbe.
=> public string GetNom()
Ensuite, pourquoi passer par une variable intermédiaire ?
=> return "x";

Alors tu es loin de correctement expliquer ton problème (tout ce qu'on sait c'est que
ça marche pas très bien

Mais le plus simple concernant ton problème est d'abonner une méthode dans ton Form1 à l'événement (probablement SelectedIndexChanged) de ton filtre.

private void OuvrirForm2()
{
    Form2 monForm2 = new Form2();
    // Lorsque l'indice sélectionné de ton filtre change, 
    // on appelle la méthode Filtre_SelectedIndexChanged
    monForm2.Filtre.SelectedIndexChanged += Filtre_SelectedIndexChanged;
    monForm2.Show();
}

private void Filtre_SelectedIndexChanged(object sender, EventArgs e)
{
    // sender correspond à l'objet ayant appelé l'événement
    // c'est-à-dire le filtre
    ComboBox filtre = sender as ComboBox;
    if (filtre != null)
    {
        // Là, tu as accès à ton filtre donc tu peux faire tout ce que tu veux avec.
        // Tu peux par exemple utiliser filtre.SelectedText ou filtre.SelectedValue
    }
}


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
11 juin 2012 à 11:29
Salut,

je suis pas sûr d'avoir bien compris. En fait c'est tes exemples de code qui me perdent un peu. Je vais donc faire une réponse "générique". Pour accéder à des donner d'une classe à l'autre (des dérivées de Form dans ton cas), tu as deux possibilités :
- avoir une référence de Form1 dans Form2 (en la passant en paramètre du constructeur de Form2 puis en l'enregistrant dans une variable membre genre parentForm),
- avoir un accesseur statique sur la propriété qui t'intéresses de Form1, comac tu y accéderas directement avec Form1.mapropriete. Cette technique peut ne pas être utilisable si tu as plusieurs instances de Form1, puisque la propriété sera partagée par toutes.
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
11 juin 2012 à 11:53
Salut Krimog,

Déjà merci pour ta réponse rapide.
Quand j'ai mis :

  public string nom(variable)
        {
            string sNm = "x";
            return sNm;
        }


c'était pour illustrer , le moyen que j'utilise, et non pas le code que j'utilise qui est celui-ci :

        public string get_name_cell()
        {
            string name_cell = dataGridView1.Columns[0].HeaderText;
            return name_cell;
        }


Merci de m'avoir enseigné la convention de nommage, je ne la connaissais absolument pas. Je vais pas oublier les majuscules dorénavant.

Désolé je pensais que le message était clair, il n'est pas forcément évident d'expliquer les problèmes que l'on rencontre.

Je vais essayer avec ton code , mais je n'utilisais pas "l’évènement SelectedIndexChanged"

Je me lance :

Sur ma Form1 j'ai ceci :

Un DatagridView1 avec :

        public class LigneUser 
        {
            public string ID { get; set; }
            public string Prenom { get; set; }
            public string Nom { get; set; }
            public string Etage { get; set; }
            public string IP { get; set; }
            public string Poste { get; set; }
            public string Modele { get; set; }
            public string Pass_Systeme { get; set; }
            public string Pass_Zimbra { get; set; }
        }


et

        private void rechercherToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form8 f8 = new Form8();
            f8.Owner = this;
            f8.Show();
        }


La Form2 est comme ceci :

Un textBox et 4 radios :

Dans l'ordre : ID - IP - POSTE - MODEL

et un Bouton Rechercher.

Ce que je souhaite, c'est que quand l'utilisateur appuie sur Rechercher, selon le radio choisi et la valeur du textbox, cela me lance le datagridview1 sur la Form1 avec
:

if (tab[i].ToLower().Contains(sId.ToLower())) // Sur la Form1

Où sId est la valeur récupérer de la Form2 (du textbox).

Voila j’espère que j'ai fais mieux.
Merci d'avance et une nouvelle fois désolé.

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
0

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

Posez votre question
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
11 juin 2012 à 11:57
Salut Jopop ,

j'ai réécris tous ça. Ça sera (j’espère) plus clair.


-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
11 juin 2012 à 16:23
Re,

je crois avoir un peu mieux saisi la demande. Et en fait y'a pas mal de méthodes possibles. Celle de krimog est bien pensée, mais pas nécessairement facile à mettre en place dans ton cas (càd : le sender ne te donnera pas accès aux valeurs de ta RadioButtonList ou de ta TextBox).

Je ne connais pas bien la classe DataGridView, donc j'imaginerai simplement que tu définis dans Form1 une fonction qui prend en paramètre le type de recherche (ID, IP, POST ou MODEL, valeurs de ta RadioButtonList) et la clé de recherche (valeur de ta TextBox) et fais le taff, genre :
public class Form1 {
    public void FiltreMonDataGrid(string ptype, string pvalue) {
        // le code qui va bien avec un switch tout-ça-tout-ça ...
    }
}


Dans l'évènement associé à ton bouton "Rechercher" dans Form2, sachant que ton instance de Form1 est accessible via la propriété Owner, tu n'as alors plus qu'à faire ça :
public class Form2 {
    protected void btnSearch_Click(object sender, EventArgs e) {
        // on appelle la fonction de Form1
        this.Owner.FiltreMonDataGrid(rbtnlChoices.SelectedValue, txtValue.Text);
        // on ferme cette fenêtre qui n'a plus lieu d'être
        this.Close();
    }
}


J'espère avoir bien compris la demande et ne pas avoir répondu à côté ^^

PS : il est important que ta fonction FiltreMonDataGrid soit public, sinon elle sera pas visible dans Form2,
PS2 : tu peux utiliser une énumération pour tes types de recherche, ça fait plus propre.
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
11 juin 2012 à 16:47
Re,

En cherchant un peu j'ai réussi à quelques petits trucs
sur ma Form2 dans le Designer , j'ai mit les champs que je veux récupérer en "Public"

Ca ma permit avec la technique de Krimog de faire

Form8 f8 = new Form8();
f8.Show();

string sFiltre = f8.tFiltre.Text;
int iFiltre = f8.iFiltre.Text;


Maintenant j'aimerais appeler ma fonction uniquement quand le bouton rechercher est clické, c'est la que je trouve pas (ma fonction : data_recherche(sFiltre, iFiltre) )

Quand j'essaye ta ligne :

this.Owner.data_recherche(sFiltre, iFiltre);

ça ne fonctionne pas, il me met une erreur sur .Owner .
Voila , merci .

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
11 juin 2012 à 16:53
Rectification, je peux faire this.Owner mais i ltrouve pas ma fonction de la form1 qui est bien en public

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
12 juin 2012 à 12:40
Re,

Ben écoute Jopop,
Ça fonctionne niquel.
Merci beaucoup. Comme d'habitude tu es mon sauveur

A bientôt.

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
0
Rejoignez-nous