2010-04-19 10 views
3

J'appelle trois fonctions dans mon code où je veux valider certains de mes champs. Lorsque je tente de travailler avec le code ci-dessous. Il vérifie seulement pour la première valeur jusqu'à ce qu'il obtienne un faux résultat.Appeler toutes les 3 fonctions en utilisant ou opérateur même après avoir renvoyé vrai en conséquence

Je veux quelque chose comme ça si la fonction fisrt renvoie vrai alors elle devrait aussi appeler la fonction suivante et ainsi de suite. Qu'est-ce qui peut être utilisé à la place de Ou Opérateur pour le faire.

if (IsFieldEmpty(ref txtFactoryName, true, "Required") || 
     IsFieldEmpty(ref txtShortName, true, "Required") || 
     IsFieldEmpty(ref cboGodown, true, "Required")) 
    { } 

EDIT

public bool IsFieldEmpty(ref TextBox txtControl, Boolean SetErrorProvider,string msgToShowOnError) 
{ 
    ErrorProvider EP = new ErrorProvider(); 
    if (txtControl.Text == string.Empty) 
    { 
     EP.SetError(txtControl, msgToShowOnError); 
     return true; 
    } 
    else 
    { 
     EP.Clear(); 
     return false; 
    } 
} 

S'il vous plaît commentaire, cette méthode est bien en utilisant la variable ref comme l'un des paramètres.

Je vérifie l'événement onSubmit de validation dans winform.

+1

Je peux me tromper, mais entre autres, vous semblez abuser de ErrorProvider. Vous devriez probablement avoir une instance en tant que membre de formulaire au lieu d'en créer une nouvelle à chaque validation. –

Répondre

10

Vous pouvez utiliser le | unique pour OU:

if (IsFieldEmpty(ref txtFactoryName, true, "Required") | 
    IsFieldEmpty(ref txtShortName, true, "Required") | 
    IsFieldEmpty(ref cboGodown, true, "Required")) 
{ } 

Le double-pipe || effectue short-circuit evaluation, la single version|-t évaluation complète.
Idem pour && et &. Voir le MSDN reference.

Réponse à la Modifier:

  1. Il n'y a pas besoin de la « ref » devant txtControl, et le retrait qui irait un long chemin pour faire face aux critiques sur votre approche ici. IsFieldEmpty n'apporte aucune modification à txtControl. Vous pouvez renommer CheckFieldEmpty pour l'améliorer un peu plus loin.
  2. Il est étrange que vous créiez une instance ErrorProvider à l'intérieur de cette méthode, cela fonctionne-t-il? Il devrait normalement y avoir une instance (permanente) sur le formulaire. Vous voulez probablement que cette méthode soit indépendante du formulaire, il suffit donc d'ajouter un EP en tant que paramètre. Il peut remplacer SetErrorProvider, vous pouvez vérifier le paramètre EP pour null. O, et remplacer EP.Clear(); avec Ep.SetErrortxtControl, "");
+2

Le caractère unique '|' est une opération au niveau du bit. Tu as raison de ne pas court-circuiter, et ça fera ce que tu veux dans ce cas, mais beurk. – RichieHindle

+4

Incorrect, les opérateurs '|' et '&' sont à la fois logiques et binaires, en fonction des opérandes, il est donc parfaitement légal d'utiliser ceux-ci pour les opérations logiques. Et oui, il n'y a pas non plus de court-circuit. Pour la documentation, vérifiez http://msdn.microsoft.com/en-us/library/6a71f45d(VS.71).aspx. Si elles avaient été bitwise seulement, l'expression n'aurait pas compilé, car il n'y a pas de conversion automatique à bool, donc l'instruction if serait 'if (int) {}' –

+0

@Richiel: Non, je cherche un lien officiel mais '|' est défini comme un opérateur booléen. (Liens ajoutés) –

10

rendre explicite ce que vous faites:

bool isFactoryNameEmpty = IsFieldEmpty(ref txtFactoryName, true, "Required"); 
bool isShortNameEmpty = IsFieldEmpty(ref txtShortName, true, "Required"); 
bool isGodownEmpty = IsFieldEmpty(ref cboGodown, true, "Required"); 
if (isFactoryNameEmpty || isShortNameEmpty || isGodownEmpty) 
{ 
    // ... 
} 

(, je suppose que vous avez besoin également d'appeler les trois fonctions parce qu'ils ont des effets secondaires Où?

+7

Je recommande fortement cette approche. Vraisemblablement, vous voulez éviter le court-circuit parce que vos méthodes ont des effets secondaires. Les méthodes ne sont pas appelées simplement pour interroger un état. Dans ce cas, le mélange des appels de méthode dans une instruction if masque les intentions pleines derrière la réalisation des appels de méthode. –

+1

-1 Cela ajoute une montagne de texte inutile, nuisant à la lisibilité sans changer la fonctionnalité. La solution de Henk est beaucoup plus lisible; il y a une raison pour qu'il y ait à la fois des opérateurs logiques de court-circuit et de non-court-circuitage. –

+1

@Adam: Je pense que la lisibilité serait plus blessée par le bon commentaire que vous auriez à ajouter au-dessus de la solution '|', expliquant pourquoi vous utilisez '|' plutôt que le plus évident '||'. (Renommer 'IsFieldEmpty' aiderait dans les deux cas, bien sûr!) – RichieHindle

0

Ce que vous voyez s'appelle un court-circuit en C#. Si la première expression échoue, il ne sera pas la peine d'essayer les suivantes, car le résultat final a déjà été déterminé.

http://johnnycoder.com/blog/2006/08/02/short-circuit-operators-in-c/

Vous devriez vous | au lieu de || pour obtenir votre résultat.

if (IsFieldEmpty(ref txtFactoryName, true, "Required") | 
     IsFieldEmpty(ref txtShortName, true, "Required") | 
     IsFieldEmpty(ref cboGodown, true, "Required")) 

C# opérateurs http://msdn.microsoft.com/en-us/library/6a71f45d.aspx

|| opérateur. http://msdn.microsoft.com/en-us/library/6373h346.aspx

| opérateur. http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx

6

Pourquoi en auriez-vous besoin? La seule raison à laquelle je peux penser est que votre fonction "IsFieldEmpty" effectue également des calculs ou des modifications sur les données, et cela m'inquiète. Une fonction nommée "IsFieldEmpty" ne devrait vraiment rien faire d'autre.

Dans ce cas, du point de vue facilité d'utilisation/maintenabilité, vous seriez mieux avec:

SomeFieldMaintenance(ref txtFactoryName, true, "Required") 
SomeFieldMaintenance(ref txtShortName, true, "Required") 
SomeFieldMaintenance(ref cboGodown, true, "Required") 
if (IsFieldEmpty(txtFactoryname) || 
    IsFieldEmpty(txtShortName) || 
    IsFieldEmpty(cboGodown)) 
{ } 

Ou quelque chose de cet acabit.

+0

+1 pour voir le bois pour les arbres! – RichieHindle

+0

Je serais d'accord que la fonction pourrait être plus appropriée, mais pourquoi la fonction supplémentaire (en particulier avec un paramètre 'ref')? –

+0

Je ne renomme pas, je le divise en deux fonctions. Un pour faire n'importe quel entretien de terrain est nécessaire, un pour vérifier si l'un des champs est vide. Il se pourrait bien que renommer cela suffirait, mais nous ne pouvons pas le savoir parce que nous n'avons aucune idée de ce qui se passe dans la fonction IsFieldEmpty - seulement qu'il fait quelque chose de plus que ce qu'il dit sur l'étiquette. Mais vous avez raison, dans ces circonstances, l'arbitre devrait probablement être déplacé ... – Trevel

0

Les réponses à ce jour supposaient que vous vouliez valider tous les champs, même après l'échec de l'un d'entre eux. Cette hypothèse n'est pas explicite dans votre question initiale. Donc, si cela ne vous dérange pas d'arrêter la validation quand un champ échoue, alors la solution la plus simple est d'utiliser l'opérateur & & au lieu de ||. Cela permettra d'atteindre l'objectif que vous vous êtes fixé: "si la première fonction renvoie vrai, elle devrait également appeler la fonction suivante et ainsi de suite". Cependant, si la première fonction renvoie false, aucune des autres fonctions ne sera appelée, ce qui peut ne pas être ce que vous voulez.