2009-12-01 7 views
0

J'essaie de trouver un moyen très simple de stocker une valeur booléenne pour chaque onglet d'un tabcontrol. chaque page a une zone de texte, et je voudrais stocker une page bool foreach donc si tabpage 1 a été sauvegardé, alors bool1 est défini sur true, else false, et ainsi de suite.liste? dictionnaire? tableau?

puis quand ils vont pour fermer le programme, il va parcourir tous les onglets et voir si chaque onglet a été enregistré ou non. Je dois être capable de créer une sorte de liste que je peux rechercher et manipuler.

J'ai précédemment utilisé des propriétés de balises pour cela mais pour une raison qui ne fonctionne plus CORRECTEMENT.

des conseils d'aide serait greatl, y apprécié :)

merci,

Bael.

+2

Quel est exactement le problème avec tag? –

+0

si la propriété Tag est nulle, elle dit souvent non définie à l'instance d'un objet, et dit la même chose même si elle n'est pas nulle parfois. Je ne fais rien de différent de quand il travaillait, donc je suis confus. –

+0

Vous devez comprendre le bogue avant de changer votre code.Si vous ne savez pas ce qui se passe, utilisez le débogueur et examinez-le soigneusement. Si vous obtenez une exception NullReferenceException, quelque chose est quelque part ** vraiment ** mis à null. – Groo

Répondre

4

Ni tableau, ni liste, ni dictionnaire ne constituent la bonne structure de données pour le suivi de l'état booléen d'un ensemble d'objets. La structure qui fait cela et rien de plus est HashSet<T>. Soit un T est dans l'ensemble, ou il ne l'est pas.

Il est supérieur à un Dictionary<T, bool> parce qui maintient en fait deux états: si l'objet est dans le dictionnaire ou non, et si elle est, si sa valeur est vraie ou fausse.

Il est supérieur à un List<T> pour deux raisons: Il est plus rapide (bien que dans votre cas, ce sera presque certainement négligeable), et cela ne signifie pas qu'il y ait un sens à l'ordre des objets qu'il contient, depuis le l'ordre des objets dans un HashSet<T> est arbitraire.

+0

Je suis d'accord avec vous concernant 'Dictionnaire ' vs 'HashSet ', mais je trouve la réponse un peu trompeuse à première vue - - ie je préférerais toujours 'Dictionary ' sur 'HashSet ' parce que cela me donnerait une option pour attacher n'importe quelle donnée ** ou fonctionnalité ** à chaque page dans le futur. – Groo

+0

Choisir 'HashSet ' est YAGNI en action. –

4

Vous pouvez utiliser par exemple un Dictionary<TabPage,bool>. Au début de votre application:

var pageStates=new Dictionary<TabPage,bool>(); 

foreach(var page in tabControl.TabPages) { 
    pageStates.Add(page, false); 
} 

Pour changer l'état d'un TabPage:

pageStates[page]=true; 

Et quand la fin de votre application:

foreach(var page in TabControl.TabPages) { 
    if(pageStates[page]) { 
     //The page is saved 
    } 
} 
+0

merci beaucoup pour votre aide et aussi pour prendre le temps de fournir l'exemple de code aussi :) –

4

List<TabPage>

magasin seulement ceux onglet (s) qui doit être sauvegardé. Si vide, rien ne doit être sauvegardé.

1

Si vous parcourez sans supprimer ou ajouter des éléments, utilisez la matrice.

Si vous parcourez mais ajoutez et supprimez des éléments, utilisez la liste.

Si vous utilisez des chaînes comme clés, utilisez le dictionnaire.

Le dictionnaire a des performances de recherche très rapides avec un nombre élevé d'éléments par rapport à la liste.