Problème choix de dossier et passage par ref [Résolu]

Signaler
Messages postés
41
Date d'inscription
jeudi 7 juin 2007
Statut
Membre
Dernière intervention
15 septembre 2008
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Bonjour,

XP SP1, IDE SharpDevelop 1.1, Framework .Net 1.1

voila, après avoir réussi un programme en VB.NET, je cherche à le reprogrammer en C#.NET. Je suis débutant en  C# et je ne comprend pas ce qui se passe dans le morceau de code ci dessous.
Normalement, quand je clique sur le Btn1, il me propose une boite de dialogue pour choisir un dossier et inscrire le resultat dans le textbox txtRépertoire.

Mais en compilant il me marque une erreur : "Une propriété ou un indexeurne peut pas être passé en tant que paramètre de sortie (out) ni de référence (ref)"

la question est donc pourquoi ??

-----------------------
        void Btn1Click(object sender, System.EventArgs e)
        {
            this.ChoixDossier("Sélectionner le répertoire où sont enregistrés les fichiers contenant les données brutes",ref this.txtRépertoire.Text);
        }//void BtnChangerRépertoireDonnéesBrutesClick
        
        ///<summary>
        /// Fonction renvoyant le dossier selectionner à l'aide de la boite de dialogue.
        ///
        /// Texte afficher dans la boite de dialogue pour indiquer le type de dossier recherché.
        ///

        ///</summary>
        private string SelectionnerDossier(string txtDescription)
        {
            string tmptxt; //variable temporaire qui contiendra le chemin après le dispose
            FolderBrowserDialog fBrowser = new FolderBrowserDialog();            fBrowser.RootFolder Environment.SpecialFolder.Desktop; //bureau chemin par défault
            fBrowser.Description = txtDescription;//description passé en arguments
            fBrowser.ShowDialog();//affichage
            tmptxt = fBrowser.SelectedPath;
            fBrowser.Dispose();
            return tmptxt;
        }//private string SelectionnerDossier(string txtDescription)
        
        ///<summary>
        /// Méthode qui renvoie le chemin du dossier dans txtZoneText

        /// </summary>
        ///
        /// Variable contenant le chemin du dossier selectionner ou le chemin passé en argument si aucun dossier n'a été selectionné.
        ///

        private void ChoixDossier(string txtDescription, ref string txtZoneTexte)
        {
            string tmptxt;
            tmptxt = txtZoneTexte;
            txtZoneTexte = this.SelectionnerDossier(txtDescription);
            if (txtZoneTexte == "") {
                txtZoneTexte = tmptxt;
            }//if (txtZoneTexte == "")
        }//private void ChoixDossier(string txtTexte, ref string txtZoneTexte)
--------------------

Merci pour vos réponses !!

RB

3 réponses

Messages postés
168
Date d'inscription
jeudi 28 juin 2001
Statut
Membre
Dernière intervention
18 octobre 2008
7
Salut,

Le pourquoi est un peu bizarre à expliquer... peut-être que quelqu'un le fera mieux que moi. En bref, il faut voir les accesseurs (comme Text dans this.txtRépertoire.Text) comme des méthodes :
this.txtRépertoire.getText();
et
this.txtRépertoire.setText(string value);
C'est d'ailleurs comme cela que ça marche en J# si je ne m'abuse.

Il est donc un peu compliqué pour le compilateur de passer en référence un accesseur (il faudrait plutôt passer un pointeur de fonction (cf. les délégués) mais c'est un peu trop compliqué pour ce que tu veux faire).

Pour résoudre ton problème, tu as, de mon point de vue, deux solutions :
1) soit tu changes le prototype de ChoixDossier :
string ChoixDossier(string txtDescription)
{
    //... ton code
    // utilises return pour renvoyer ce qui devrait être dans txtZoneText   
}
2) tu modifies le code de BtnClick1 comme suit :
String temp = this.txtRépertoire.Text;
this.ChoixDossier("Sélectionner le répertoire où sont enregistrés les fichiers contenant les données brutes",ref temp);
this.txtRépertoire.Text = temp;

J'espère t'avoir aidé.
Messages postés
41
Date d'inscription
jeudi 7 juin 2007
Statut
Membre
Dernière intervention
15 septembre 2008

Merci Niky,

j'ai utilisé la deuxième méthode pour l'instant.

La deuxième est plus compliqué à mettre en oeuvre car en fait les fonctions choixdossier et selectiondossier vont être utiliser pour plusieurs boutons.

encore merci
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Dans les spécifications de C#, il est indiqué que ref et out prennent des variables et pas des indexeurs (ou properties).

Plus intéressant: cette opération est tout à fait faisable en VB.NET.
Si on regarde le code généré par le compilo, on voit qu'il fait lui même le changement nécessaire en passant par une variable intermédiaire.

<hr />
-Blog-