Passer des paramètres par référence entre deux Formes
J'ai deux formulaires (Form1 et Form2). Sur Form1, il est un "public int i' variable, qui est fixé à la valeur 1 dans Form1 constructeur.
Puis-je ouvrir Form2 de Form1 avec ce code:
Form2 f2 = new Form2(ref i);
f2.ShowDialog();
Le constructeur de Form2 ressemble à ceci:
public int i;
public Form2(ref int x)
{
InitializeComponent();
i = x;
}
Puis j'ai mis la variable i sur Form2 à la valeur 2 et fermer Form2. Maintenant, j'attendrais la variable i sur Form1 pour avoir la valeur 2 (à cause de " ref " mot-clé par passage de paramètres), mais la valeur est toujours 1. Ce que je fais mal et pourquoi est-ref mot-clé ne fonctionne pas dans mon exemple?
Grâce
OriginalL'auteur sventevit | 2009-09-21
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe réellement.
Il existe de nombreuses façons d'accomplir ce que vous voulez, que ce soit avec des événements, ou par le passage d'un objet qui sera partagé entre l'objet1 et objet2.
Ce serait probablement la meilleure façon d'accomplir ce que vous allez pour.
Vous pouvez également passer d'une forme de référence/de l'instance au lieu de l'Objet que j'
OriginalL'auteur C. Ross
La "ref" modificateur ne fait aucune différence lors de l'appel du constructeur lui-même. C'est seulement associé à cette paramètre... et après le constructeur a fini, ce paramètre n'existe plus.
Lorsque vous effectuez la mission:
C'est juste de la copie de la valeur. Il n'est pas d'associer la variable
i
avecx
de toute autre manière.Comme une règle générale: si vous ne modifiez pas la valeur du paramètre dans la méthode ou le constructeur (qui vous ne vous sentez pas dans votre exemple), la
ref
modificateur n'est pas de faire quoi que ce soit.Vous ne pouvez pas faire ce que vous voulez faire: vous ne pouvez pas faire un champ (Form2.
i
dans le cas présent) un alias d'une autre variable.J'ai vraiment l'espoir que le code réel ne pas ont un champ public... et que la classe n'était pas vraiment appelé Form2, soit 🙂
OriginalL'auteur Jon Skeet
Si vous voulez vraiment être en mesure de définir une variable dans Form1 à partir de l'intérieur de Form2 vous pouvez utiliser une méthode de rappel. (c'est à dire passer l'adresse d'une méthode qui définit la Form1 variable et l'exécute à partir de Form2)
Quelque chose comme ceci:
Grands excès de si. Vous pourriez tout simplement une propriété publique sur form1.
OriginalL'auteur MLT
Je suis d'accord avec Martin que ce type de solution serait de rajouter du couplage, mais si vous insistez toujours sur de l'avoir attaché comme cela, je pense que l'aide d'un simple pointeur ferait l'affaire.
Puis dans Form2 que vous venez de travail avec le pointeur.
N'oubliez pas de garder à l'esprit la gestion de la mémoire avec tout cela.
OriginalL'auteur dharga
Cette déclaration est la copie de la valeur de i à la valeur de x. Pour modifier x, vous devez attribuer une valeur dans le constructeur. par exemple.
OriginalL'auteur Ash
la
ref keyword
champ d'application est uniquement à l'intérieur de la déclaration de la méthode: Form2 constructeur.Une fois que la sortie de la méthode, j'ai dans form1 et j'en form2 ne sont plus liés (spécialement parce qu'ils sont de ValueType)
OriginalL'auteur manji
Je ne sais pas votre raisonnement derrière le faire de cette façon, mais je soupçonne que ce serait une bien meilleure idée de retourner une valeur à partir de votre boîte de dialogue formulaire et l'utiliser pour définir la variable dans la classe d'appel. Vous serait ajouter inutile de couplage à vos formulaires autrement.
OriginalL'auteur MLT
Merci pour les réponses...
Pour l'instant, j'ai trouvé trois façons d'obtenir le retour à la variable de Feuil2 Feuil1:
Est-il une autre option? Laquelle de ces trois options est la meilleure? (Dans mon exemple j'ai besoin d'avoir accès qu'à un nombre entier dans Form1 à partir de Form2)
Grâce
OriginalL'auteur sventevit