2010-03-05 8 views
2

Je suis en train d'écrire une erreur de vérification et d'essayer d'utiliser un tableau booléen pour stocker vrai ou faux dans les éléments, puis ma condition finale analyse les éléments stockés pour déterminer si son Tout est vrai dans Visual Studio 2008. Theres probablement un moyen plus facile de faire la vérification des erreurs, mais pourrait aussi bien apprendre à utiliser un tableau. Voici ce que j'ai jusqu'à présentVérification des valeurs d'éléments dans un tableau booléen - C#

bool[] checker = new bool[1]; // declared array...I think 

private void print_button_Click(object sender, EventArgs e) 
{ 
    if (authorbox.Text == "") 
    { 
    MessageBox.Show("Author field empty", "Required Entry"); 
    } 
    else 
    { 
    checker[0] = true; // assigning element to array correctly? 
    } 

    if (titlebox.Text == "") 
    { 
    MessageBox.Show("Title field Empty", "Required Entry"); 
    } 
    else 
    { 
    checker[1] = true; 
    } 

    // The part I am having trouble with basically if any of my array elements are 
    // false don't execute printing. Else go ahead and print. 
    if() 
    { 
    } 
    else 
    { 
    printPreviewDialog1.Document = printDocument1; 
    printPreviewDialog1.ShowDialog(); 
    } 
} 
+0

'vérificateur [1] = true;' jetteront une sortie d'erreur de limites: votre tableau ne comporte qu'un seul élément ('bool [1]'), qui sera à l'index 0 (index C du tableau n sont 0 -basé). Je pense que vous voulez dire que 'checker' est un tableau à deux éléments, c'est-à-dire' bool [] checker = new bool [2]; '. – itowlson

+0

Une erreur dans votre code. Si vous déclarez un tableau à avoir 1 index (new bool [1]) ... Il ne peut pas avoir de vérificateur [1].Le nombre dans [] est le nombre ou le nombre total d'éléments du tableau. Les valeurs d'index réelles qui les référencent seraient alors basées sur zéro. Donc, vous auriez besoin de faire bool [] checker = new bool [2]; être capable de faire checker [0] et checker [1] – NebuSoft

Répondre

1

au lieu d'utiliser le tableau, il serait beaucoup plus facile de sortir tout simplement la méthode dès qu'une erreur est détectée:

private void print_button_Click(object sender, EventArgs e) { 
    if (authorbox.Text == "") { 
    MessageBox.Show("Author field empty", "Required Entry"); 
    return; 
    } 

    if (titlebox.Text == "") { 
    MessageBox.Show("Title field Empty", "Required Entry"); 
    return; 
    } 

    printPreviewDialog1.Document = printDocument1; 
    printPreviewDialog1.ShowDialog(); 
} 
+0

Quitter immédiatement après avoir détecté la première erreur cause des problèmes d'utilisabilité. Si l'auteur et le titre sont obligatoires et que les deux sont manquants, vous devez en informer l'utilisateur. Sinon, l'utilisateur corrige une erreur seulement pour se faire dire "oh, mais il y a une autre erreur dont je ne vous ai pas parlé." (Il est vrai que la séquence de plusieurs boîtes de message du code original avait aussi une mauvaise utilisabilité, mais au moins cela donnait à l'utilisateur toutes les informations dont il avait besoin.) – itowlson

+0

avoir 10 boîtes de message apparaitrait plutôt ennuyeux. peut-être préférable de simplement passer à l'aide des fournisseurs d'erreur (et désactiver le bouton à la demande) ou au moins de recueillir les messages d'erreur dans une liste et les afficher dans une seule boîte à message ... de toute façon, je n'utiliserais pas de tableaux bool . – stmax

+0

retour a fini par bien fonctionner. – Matt

1

Bien que ce ne soit pas le moyen idéal pour la gestion des erreurs, mais vous pouvez utiliser la méthode .Contains().

if (checker.Contains(false)) 
{ 
    // Do Something 
} 
else 
{ 
    printPreviewDialog1.Document = printDocument1; 
    printPreviewDialog1.ShowDialog(); 
} 
1

En plus d'autres choses, vous devriez dire

bool[] checker = new bool[2]; 

si vous voulez un tableau composé de 2 éléments;) Dans ce cas particulier, le tableau ne semble pas faire trop de sens, parce que ça obscurcit un peu les choses. Vous pourriez faire la même chose avec une seule variable booléenne.

+0

Ha, tout à fait raison. Je n'ai pas remarqué cette partie moi-même. –

0

Je suis assez sûr que la méthode proposée par Contains NebuSoft est une extension LINQ et donc pas disponible dans .NET 2.0. Vous pouvez cependant utiliser la méthode Array.IndexOf<T>, comme ceci:

if (Array.IndexOf<bool>(checker, false) != -1) 
{ 
    // some element in the array is false 
} 
else 
{ 
    // no false in the array 
} 

Cependant, NebuSoft est juste d'affirmer que ce n'est pas la meilleure approche. Si vous êtes curieux d'en savoir plus, je serai heureux d'en discuter davantage.

+0

Tout à fait raison. J'ai tendance à faire l'hypothèse de 3.5 en utilisant VS 2008 mais ce n'est pas toujours le cas. :) – NebuSoft

+0

Liste .Contains n'est pas lié à LINQ et est disponible dans la version 2.0 du framework .NET. – RoadWarrior

+0

Mais bool []. Contient est lié à LINQ. – RoadWarrior

4

Si vous utilisez .NET 3.5 vous pouvez utiliser Any and All pour voir si des booléens sont vraies, ou si tous sont remplies:

if (checker.Any(x => x)) 

ou:

if (checker.All(x => x)) 

En outre, si vous voulez un tableau de deux booléens, vous devez utiliser new bool[2] et non new bool[1]. Il serait plus facile d'utiliser un List<bool> cependant.

+0

Si .NET 3.5 est disponible, ce serait mon moyen préféré, ne serait-ce que pour être parfaitement succinct. –

+1

Je me rends compte qu'effectivement/logiquement cela va accomplir la même chose que «Contient (x)», mais ça me semble un peu rond. Essentiellement ce que ces méthodes vont faire est d'énumérer par 'checker' et d'évaluer' if ((checker [i] == true) == true) '... –

1

L'utilisation de tableaux booléens pour accumuler un go/no go-valeur est surpuissant. Il y a des choses plus utiles avec lesquelles vous pouvez jouer pour obtenir le tableau des tableaux.

Vous êtes mieux simplement ANDing les résultats de vos contrôles intermédiaires dans une valeur, puis vérifier que pour vrai/faux:

public bool CheckControls() 
{ 
    bool pass = true; 
    pass &= !string.IsNullOrEmpty(authorbox.Text)); 
    pass &= !string.IsNullOrEmpty(titlebox.Text)); 
    // if any of these are empty then pass is to false and stays that way. 
    return pass; 
} 

Si vous avez besoin de garder une trace de quel test intermédiaire a échoué, puis envisager en utilisant un nombre entier et des constantes prédéfinies de puissances de deux. Ici, vous vérifiez plutôt zéro si tout va bien. Cela vous permet de masquer la valeur renvoyée et d'accumuler toute combinaison de résultats de test. Tant que vous avez moins de 32 (ou 64) tests.

int AUTHORBOX = 2; 
    int TITLEBOX = 4; 
    int ISBNBOX = 8; 
    int PRICEBOX = 16; 

    public int AlternateCheck() 
    { 
     int temp = 0; 
     temp += string.IsNullOrEmpty(authorbox.Text) ? AUTHORBOX : 0; 
     temp += string.IsNullOrEmpty(titlebox.Text) ? TITLEBOX : 0; 
     temp += string.IsNullOrEmpty(isbnbox.Text) ? ISBNBOX : 0; 
     temp += string.IsNullOrEmpty(pricebox.Text) ? PRICEBOX : 0; 
     return temp; 
    } 
Questions connexes