Comment puis-je supprimer des nœuds d’un SiteMapNodeCollection ?
Question
J'ai un répéteur qui répertorie tous les web.sitemap
pages enfants sur une page ASP.NET.C'est DataSource
est un SiteMapNodeCollection
.Mais je ne veux pas que ma page de formulaire d’inscription apparaisse ici.
Dim Children As SiteMapNodeCollection = SiteMap.CurrentNode.ChildNodes
'remove registration page from collection
For Each n As SiteMapNode In SiteMap.CurrentNode.ChildNodes
If n.Url = "/Registration.aspx" Then
Children.Remove(n)
End If
Next
RepeaterSubordinatePages.DataSource = Children
Le SiteMapNodeCollection.Remove()
la méthode lance un
NotSupportedException :"La collection est en lecture seule".
Comment puis-je supprimer le nœud de la collection avant de DataBinding le répéteur ?
La solution
Vous ne devriez pas avoir besoin de CType
Dim children = _
From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
Where n.Url <> "/Registration.aspx" _
Select n
Autres conseils
Utilisation de Linq et .Net 3.5 :
//this will now be an enumeration, rather than a read only collection
Dim children = SiteMap.CurrentNode.ChildNodes.Where( _
Function (x) x.Url <> "/Registration.aspx" )
RepeaterSubordinatePages.DataSource = children
Sans Linq, mais en utilisant .Net 2 :
Function IsShown( n as SiteMapNode ) as Boolean
Return n.Url <> "/Registration.aspx"
End Function
...
//get a generic list
Dim children as List(Of SiteMapNode) = _
New List(Of SiteMapNode) ( SiteMap.CurrentNode.ChildNodes )
//use the generic list's FindAll method
RepeaterSubordinatePages.DataSource = children.FindAll( IsShown )
Évitez de supprimer des éléments des collections car cela est toujours lent.À moins que vous ne parcouriez plusieurs fois, il est préférable de filtrer.
Je l'ai fait fonctionner avec le code ci-dessous :
Dim children = From n In SiteMap.CurrentNode.ChildNodes _
Where CType(n, SiteMapNode).Url <> "/Registration.aspx" _
Select n
RepeaterSubordinatePages.DataSource = children
Existe-t-il une meilleure façon de ne pas avoir à utiliser le CType()
?
De plus, cela place les enfants dans une situation System.Collections.Generic.IEnumerable(Of Object)
.Existe-t-il un bon moyen de récupérer quelque chose de plus fortement typé, comme un System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)
ou encore mieux un System.Web.SiteMapNodeCollection
?