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 ?

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top