2009-08-21 10 views
1

J'écris un éditeur de base de données/Bill of Materials Maker (2 .exe distinct) pour le travail, et j'ai ce problème fou. Voici comment le flux fonctionne dans les applications: Base de données ouverte, Base de données de recherche, Vérifier les éléments nécessaires, Envoyer à BOM Maker, Enregistrer sous .xls.Quelle est la meilleure façon de vérifier un ListView pour les éléments cochés en C#?

Jusqu'ici, je peux envoyer des articles cochés à la BOM Maker, mais seulement si j'ouvre la fenêtre de recherche, vérifier les articles, sans réellement chercher dans la liste. À l'heure actuelle dans le formulaire de recherche de l'éditeur de base de données, j'ai cette boucle:

for (int i = 0; i < rowCount; i++) 
{ 
    if (ResultBox1.Items[i].Checked == true) 
    { 
     //Code that creates .txt file to be loaded by the BOM Maker... 
    } 
} 

La boucle fonctionne parfaitement, mais seulement si j'éviter d'utiliser la fonction de recherche. La fonction de recherche efface le ListView, et le peupler avec des résultats, mais pourquoi cela importerait?

L'erreur que je reçois est:

InvalidArgument = valeur de '22' est pas valide pour 'index'. Nom du paramètre: index

« 22 » étant la ligne que j'ai vérifié par rapport au tableau que j'utilise pour alimenter le ListView dès le début. À moins que je n'aie besoin de regarder dans ma méthode de recherche, existe-t-il une autre façon d'effectuer cette action? Je suis inutile à "foreach" boucles, quelqu'un pourrait-il me donner une opinion?

Merci!

Répondre

1

Est-ce que cela fonctionne?

foreach (ListViewItem item in ResultBox1.Items) 
{ 
    if (item.Checked) 
    { 
     // Do somethign with it 
    } 
} 
+0

J'essaie d'utiliser votre code, mais pour l'instruction if, l'option est pas là ".checked" pour le "point". Une idée de comment je peux l'obtenir à venir? –

+0

AHA !! Je l'ai compris, au lieu de "var" j'ai utilisé "ListViewItems" à la place, et cela fonctionne comme un charme maintenant. MERCI! –

+0

Ahh, désolé - il a probablement supposé que 'item' était de type Object. Mon mauvais - je vais mettre à jour ma réponse. –

1

Il semble que le problème majeur est que vous obtenez votre plage d'index à partir des résultats de votre base de données, mais votre ListView ne reflète pas avec précision les résultats de la base de données que vous utilisez pour votre plage d'index.

Vous avez oublié de mettre à jour quelque chose quelque part lorsque vous faites votre recherche.

La manière la plus simple de résoudre le problème est probablement de supprimer la dépendance aux résultats de la base de données et de ne dépendre que de la liste des éléments ListView. Par exemple:

var qry = from item in ResultBox1.Items where item.Checked select item; 
foreach(var item in qry) 
{ 
    // handle checked items individually. 
} 
0

 
Assuming it is a System.Windows.Forms.ListView...

foreach(var item in ResultBox1.SelectedItems) { //Do stuff }

+0

SelectedItems est-il identique à CheckedItems? –

+0

Je crois que ce n'est pas, je voudrais cocher une case pour les articles à envoyer à la BOM Maker. Sélection de la ligne non fonctionnelle, IMO. –

Questions connexes