9
votes

Supprimer les enfants du panneau uniquement si vous êtes de type T

J'ai un panneau WPF (comme Canvas par exemple) et je veux supprimer son enfants uniquement si ces enfants sont de type < Code> T , par exemple tout de type .

Comment puis-je faire cela? Puis-je utiliser LINQ?


0 commentaires

4 Réponses :


0
votes

Certains LINQ:

panel1.Controls.OfType<Button>().ToList().ForEach((b) => b.Parent = null);


10 commentaires

-1 panneau.Controls? Avez-vous testé? msdn.microsoft.com/en-us/library/system. windows.controls.pan el


-1 enfants.Oftype () est iSeumérable pas bouton


Réessayez ... mais s'il vous plaît soyez sûr.


Toujours incorrecte. a) panneau1.control b) évaluation paresseux ( SELECT n'exécutera pas l'affectation null immédiatement)


Maintenant, pensez-vous vraiment que ce code est meilleur que la vieille boucle de la plaine? (Création d'une liste temporaire Juste pour pouvoir les utiliser à l'aide de foreach )


Le parent n'est pas en lecture seule et panneau.Controls existe-t-il - il renvoie un contrôleCollection.


@ L.b: C'est une question de préférence. Mais je suis d'accord, c'est un peu convaincu.


@Davenewza non ce n'est pas une préférence. Op vient de demander puis-je utiliser linq . Pas comment le faire à Linq


@ L.b: Mais c'est vraiment une question de préférence quant à savoir si OP utilise Linq ou les anciennes boucles de vieilles. Je pense que cela revient à la familiarité et à la lisibilité de la syntaxe. Il ne cherchait pas spécifiquement une solution linq uniquement.


@davenewza "VS" VS " "



3
votes

faire une comparaison de type. La partie délicate consiste à modifier une collection pendant que vous en boucle; Je l'ai fait en utilisant deux pour des boucles: xxx

edit

De cette façon est plus propre, en boucle de la fin de la collection, de sorte que Pour éliminer les éléments de l'intérieur de la boucle. xxx


1 commentaires

Le pour la boucle qui boucle à partir de la fin de la collection doit commencer par mypanel.children.count - 1 , sinon vous obtiendrez indexoutOfrangeException .



0
votes

ailer cela sur mon téléphone: xxx


2 commentaires

Cela ne fonctionnera pas depuis que vous ne pouvez pas supprimer des objets d'une collection tout en itération sur celui-ci avec pourvua.


Ah, quand feront-ils vs pour l'iphone afin que je puisse tester mon code d'abord = p



12
votes

Vous pouvez utiliser Linq, c'est une façon de faire.

List<Button> toRemove = new List<Button>();
foreach (var o in canvas1.Children)
{
    if (o is Button)
        toRemove.Add((Button)o);
}
for (int i = 0; i < toRemove.Count; i++)
{
    canvas1.Children.Remove(toRemove[i]);
}


3 commentaires

Enfin, simple et correct. Merci! Quelques notes sur la performance?


@Nick Il n'y aura pas de différence de performance sur Linq et Normal, j'ai préféré Linq Way. C'est votre choix de décider lequel vous avez préféré


L'électeur en bas s'il vous plaît laissez un commentaire, s'il y a quelque chose qui ne va pas ici