2012-04-05 5 views
1

J'ai souvent eu ce problème où je ne comprends pas vraiment comment passer des variables userform dans les classes. par exemple j'ai un bouton:en passant une variable de formulaire utilisateur dans la classe

private void button1_Click(object sender, EventArgs e) 
{ 
    DoStuff(); 
} 

et une méthode dans la classe de formulaire:

DoStuff() 
{ 

    Class123 myclass = new Class123(); 

} 


... 
... 

class Class123 
{ 

    //how do i pass for example in myotherClass whether or not my checkbox on the userform is checked? i dont want to have to pass from method to method to class to class. what is the logical/smart way of handling this? 
    ClassData myotherClass = new ClassData(); 
} 

comment puis-je passer par exemple dans MyOtherClass si oui ou non ma case à userform est cochée? Je ne veux pas avoir à passer de la méthode à la méthode à la classe à la classe. Quelle est la manière logique/intelligente de gérer cela?

+0

Recherchez '[C#] formulaire variable share'. Soyez heureux – sehe

Répondre

1

Je ne suis pas d'accord avec cette approche.
Toute méthode «intelligente», si elle existe, enfreindra les règles d'or de la programmation orientée objet. Un objet est un élément de données autonome accessible uniquement ou modifié de manière contrôlée. Cela évite les effets secondaires, un problème courant dans le code procédural, où les données sont globalement accessibles. Dans POO, les objets peuvent recevoir ou envoyer des messages à d'autres objets uniquement en appelant leurs méthodes.

EDIT: Pour afficher une façon de le faire

public static class MyApp 
{ 
    public static bool MyCheckBox {get; set;} 
} 

dans votre doStuff

MyApp.MyCheckBox = this.checkBox1.Checked; 

intérieur d'une méthode de votre MyOtherClass

if(MyApp.MyCheckBox == true) 
    ... 

c'est le même que l'utilisation d'un variable globale dans l'ancien temps des langages procéduraux. Cela ouvre la voie à difficile de suivre les bogues et crée le mode d'état qui rend une application difficile à maintenir

+0

bien, quelle est une façon stupide de le faire? –

+1

Très bien. Créez une classe statique globale avec une propriété booléenne représentant l'état de votre case à cocher. Définissez la valeur dans votre DoStuff et lisez partout où vous avez accès à votre classe statique globale. – Steve

+0

brillant !!! pouvez-vous me montrer le code s'il vous plaît –

3

Je pense que vous cherchez arguments de la fonction:

// notice the declared function argument isMyCheckboxChecked 
DoStuff(bool isMyCheckboxChecked) 
{ 
    Class123 myclass = new Class123(isMyCheckboxChecked); 

} 

private void button1_Click(object sender, EventArgs e) 
{ 
    // passing the state of the checkbox to DoStuff as an argument 
    DoStuff(chkMyCheckbox.Checked); 
} 


class Class123 
{ 
    readonly ClassData myotherClass = new ClassData(); 

    Class123(bool isMyCheckboxChecked) 
    { 
      myOtherClass.isMyCheckboxChecked = isMyCheckboxChecked; 
    } 
} 
+0

oui mais alors je passe cette variable stupide à travers tout –

+0

Ce qui est bien mieux que de laisser tout le monde toucher --- vos parties intimes --- données globales. En outre, je pensais que votre échantillon semblait un peu trop compliqué, il pourrait probablement faire sans beaucoup de classes, autant que je sache. En outre, DoStuff pourrait être un membre sur Class123 directement – sehe

+0

merci, pouvez-vous me dire s'il vous plaît ce que ne signifie que lire –

2

Je peux voir quelques petites choses ici. Le code affiché est plutôt vague, il est donc difficile de dire quelle est la bonne réponse.

  1. Si MyOtherClass a besoin de savoir si une case est cochée lorsque la case change alors vous devriez probablement en utilisant un modèle d'abonné. Toutefois, si vous voulez dire que vous avez juste besoin de savoir si la case à cocher a été cochée au moment où DoStuff() a été lancé, il n'y a rien de mal à transmettre une variable. En fait, le passage d'une variable est la méthode préférée - c'est ce que les variables existent. Cela dit, vous devez passer des variables intelligemment; Si vous constatez que vous ne faites que déplacer des paramètres à travers les classes, c'est un signe de code mal conçu. Si vous avez besoin de passer des paramètres à myClass pour lui dire quoi faire, construisez-les dans une classe (nommée nommément), et passez cette classe au constructeur myClass au lieu d'une longue liste de paramètres.

+0

merci beaucoup. Qu'est-ce qu'un modèle d'abonné? –

+0

Voici quelques exemples: http://msdn.microsoft.com/en-us/library/dd783449.aspx http://msdn.microsoft.com/en-us/library/ee817669.aspx – SouthShoreAK

+0

cela signifie-t-il que vous n'avez pas connaître? –

Questions connexes