Problème choix de dossier et passage par ref

Résolu
rbidocho Messages postés 41 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 15 septembre 2008 - 19 juin 2007 à 19:46
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 19 juin 2007 à 21:35
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

cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
19 juin 2007 à 19:59
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é.
3
rbidocho Messages postés 41 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 15 septembre 2008
19 juin 2007 à 20:39
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 62
19 juin 2007 à 21:35
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-
0