2011-04-22 3 views
0

J'écris get get et set pour valider une entrée d'une Text Box. Fondamentalement, il est supposé vérifier si l'utilisateur a entré toutes les valeurs. Lorsque je laisse les TextBox vides, il ne fait rien et affiche un '0' dans la sortie où cette variable était utilisée. Il montre cependant l'exception générée par le système et arrête l'exécution, mais je me demande pourquoi ne valide-t-il pas l'entrée à travers les propriétés?get et Set ne fonctionne pas

Voici mon code:

public double RecoDoseSize 
{ 
    get 
    { 
     return recoDoseSize; 
    } 
    set 
    { 
     if (!(value>0)) 
     { 
      MessageBox.Show("Please Enter the recommended dose size for this product"); 
      textBox8.Focus(); 
     } 
     recoDoseSize = value; 
    } 
} 

private void Submit2_Click(object sender, RoutedEventArgs e) 
{ 
    TotalContentProduct = double.Parse(textBox7.Text); 
    recoDoseSize = double.Parse(textBox8.Text); 
    NoOfDosespUnit = TotalContentProduct/recoDoseSize; 
} 
+0

Je ne suis pas si clair sur l'exemple de code. RecoDoseSize est-il identique à RecoDoseSize ou s'agit-il d'une variable privée sans rapport? Faites-vous référence à this.RecoDoseSize? – dawebber

+0

La raison pour laquelle vous obtenez un 0 dans le cas que vous avez décrit est que ParseMethod fait de son mieux sur une valeur par défaut de la propriété Text dans la zone de texte. – dawebber

+0

@dawebber: Puisque le getter de RecoDoseSize renvoie recoDoseSize, je suppose qu'ils sont liés. ;-) – Heinzi

Répondre

1

D'autres ont donné la bonne réponse à la question comme indiqué. A savoir que vous devriez appeler le RecoDoseSize majuscule si vous voulez utiliser le getter/setter.

Cependant, il est extrêmement mauvais d'afficher une boîte de message à l'intérieur du setter, car cela viole le Principe de Least Surprise.

Lorsque quelqu'un regarde la ligne RecoDoseSize = double.Parse(textBox8.Text); il n'est pas du tout évident que cette opération puisse provoquer l'apparition d'une boîte de message. Il existe parfois des exceptions où il est logique d'avoir une modification de l'interface utilisateur du déclencheur Setter (par exemple, la propriété Visible sur les contrôles) mais la valeur par défaut devrait toujours être de ne pas le faire, sauf si vous êtes sûr qu'il sera plus déroutant Faites-le (par exemple, il serait surprenant si vous définissez Visible = false mais il était encore visible).

En ce qui concerne votre commentaire sur la façon dont vous devriez le mettre en œuvre, le contrôle doit être fait dans le gestionnaire de clic et la propriété peut être juste un auto-propriété, comme ceci:

public double RecoDoseSize { get; set; } 

private void Submit2_Click(object sender, RoutedEventArgs e) 
{ 
    TotalContentProduct = double.Parse(textBox7.Text); 

    double enteredSize; 
    if (!double.TryParse(textBox8.Text, out enteredSize) || enteredSize <= 0) 
    { 
     MessageBox.Show("Please Enter the recommended dose size for this product"); 
     textBox8.Focus(); 
     return; 
    } 
    RecoDoseSize = enteredSize; 
    NoOfDosespUnit = TotalContentProduct/recoDoseSize; 
} 

Vous voulez utiliser TryParse, car avec Parse vous obtiendrez une erreur si le texte n'est pas un double valide. Ce que TryParse fait est de retourner true ou false selon qu'il a réussi, et il remplit le paramètre out avec le résultat s'il est réussi.

Donc ce que cela fait est si elle échoue à analyser le résultat, ou le résultat est <= 0 il montre la boîte de message. Dans ce cas, il est également return s de la méthode, donc le reste n'est pas exécuté.Alternativement le reste de la méthode pourrait être dans un bloc else auquel cas le return n'est pas nécessaire. C'est une question de style qui est préféré.

+0

Pourriez-vous s'il vous plaît moi comment pourrais-je implémenter cette fonctionnalité dans mon code? Je suis en train d'apprendre en faisant ici :( – MangoTable

+0

@Mango vous pouvez également vouloir utiliser' TryParse' pour 'textBox7' aussi Si vous utilisez 'Parse', vous dites que je sais pertinemment que le texte sera un double valide, il suffit de l'analyser pour moi.Utilisez' TryParse' quand vous n'êtes pas sûr à 100% que ce sera valide. Vous pouvez également envisager de renommer les zones de texte en quelque chose représentant ce qu'elles contiennent. – Davy8

0

Vous ne devriez pas être mise au point dans votre manipulez instruction set.

De même, vous devez vous assurer que la valeur n'est pas nulle, sinon vous ne pouvez pas la comparer à quoi que ce soit (plus grand que, etc.).

+2

la propriété est un 'double', donc' value' est aussi un double (non-nullable). Ce ne sera pas nul. –

+2

Les minuscules 'double' ne peuvent jamais être' null'. À moins que ce soit un type nullable: 'double?' – pickypg

6

Vous définissez recoDoseSize, le champ de support, pas RecoDoseSize, la propriété qui contient votre code. Ainsi, votre code n'est pas exécuté. Vous devez changer la deuxième ligne de votre corps de méthode pour

RecoDoseSize = double.Parse(textBox8.Text); 

(noter la capitale R).

+2

Un autre exemple de pourquoi les propriétés différentes et les champs par cas est une mauvaise idée. – Pondidum

+1

@Pondidum: Non, ça marche normalement (si vous savez ce que vous faites bien sûr), je suis quand même passé à des champs soulignés. –

+0

@Pond sauf si vous utilisez une mauvaise police (ou si vous avez des yeux particulièrement mauvais, je suppose), il est très facile de voir la différence entre les premières lettres majuscules et minuscules. (Le milieu d'un nom de variable peut être plus délicat puisque vos yeux ne se concentrent pas naturellement autant que sur la première/dernière lettre) – Davy8

1

Vous n'utilisez jamais réellement le getter/setter. Vous utilisez directement le nom du champ: recoDoseSize. Changez-le en RecoDoseSize.

1
private void Submit2_Click(object sender, RoutedEventArgs e) 
{ 
    TotalContentProduct = double.Parse(textBox7.Text); 
    RecoDoseSize= double.Parse(textBox8.Text); 
    NoOfDosespUnit = TotalContentProduct/recoDoseSize; 
}