2010-08-04 2 views
1

J'ai un checkBox dans mon application Windows appelé "Continuous". Lorsque l'utilisateur vérifie cela et clique sur le bouton "Traiter", l'application traitera tous les éléments de la liste. Cependant, si l'utilisateur ne coche pas cette case, il ne traitera que le premier de la liste.C# logique pour implémenter la boucle foreach lorsque la case à cocher est cochée

Dans ma méthode Process, je souhaite écrire une condition if pour vérifier la case à cocher cochée et exécuter la boucle foreach sinon exécuter uniquement le premier élément.

Voici mon code

private void btnProcess_Clicl() 
{ 

    bool bDone = false; 

    while(!bDone) 
    { 

    LoadList(); //This will load the list from database into listBox 

    if(listBox.items.Count > 0) 
    { 
     ProcessList(); 
    } 

    if(!chkBox.Checked) 
     bDone = true; 

    } 

} 

J'ai mise en œuvre de la boucle foreach à la liste traiter dans la méthode processlist(). Y a-t-il moyen d'éviter l'exécution de la méthode LoadList() si l'utilisateur vérifie checkBox en continu? LoadList() remplira le listBox à partir de la base de données.

+0

Est-ce que le problème que vous voulez seulement essayer 'ProcessList()' une fois si la case est cochée, ou est-ce que vous voulez éviter de charger la liste entière de la DB si elle n'est pas vérifiée? – AllenG

+0

Faites attention ... il semble que vous voulez modifier la liste que vous bouclez. Vous ne pouvez pas le faire à l'intérieur d'une boucle foreach. –

+0

Pourquoi votre if (! ChkBox.Checked) est-il en bas? Je ne sais pas vraiment ce que vous me demandez, mais sans plus d'explications, je suppose que vous devriez vérifier si cette case est cochée ou non avant de faire quoi que ce soit. –

Répondre

2

faire quelque chose comme ça

if(chkBox.Checked) 
    ProcessList(); 
else 
    ProcessOne(); 

Écrivez les fonctions pour faire ce que vous voulez

mise à jour

pour éviter de dupliquer le code de traitement que vous pourriez faire quelque chose comme

public void ProcessList() 
{ 
    foreach(var item in list) 
     ProcessOne(item); 
} 
+0

Donc, c'est comme écrire le code deux fois dans la méthode ProcessList() et ProcessOne(). Droite? – shanthiram

+0

Je pense que cela a du sens. Je pensais à un moyen de ne pas écrire le code deux fois mais je pense qu'il n'y a pas d'autre moyen en regardant les réponses. Merci. – shanthiram

+0

@shanthiram vous n'avez pas nécessairement besoin de dupliquer le code. voir mise à jour entrante ... –

1
Boolean doAllItems = chkBox.Checked; 
    foreach(Object something in collection) 
    { 
     DoWork(something); 
     if(!doAllItems) 
      break; 
    } 
2

L'affacturage est votre ami.

void ProcessList(int start, int count) { 
    for (int i=start; i < start + count; i++) { 
     ProcessItem(i); 
    } 
} 

void ProcessItem(int i) { // your code here 
} 

private void btnProcess_Click() { 
    if (IsContinuous) { 
     ProcessList(0, list.Count); 
    } 
    else { 
     ProcessItem(0); 
    } 
} 

private bool IsContinuous { get { return chkBox.Checked; } } 

Cela fonctionne pour vous, mais je ne surtout pas comme ça car je pense que processus devrait faire partie de la structure de données de liste elle-même et non pas mon interface utilisateur. Le modèle (et la vue) et le contrôle doivent être séparés (si possible).

Questions connexes