Hoe kan ik de knooppunten verwijderen uit een SiteMapNodeCollection?

stemmen
1

Ik heb een Repeater dat alle lijsten kreeg web.sitemapkind pagina's op een ASP.NET-pagina. Het DataSourceis een SiteMapNodeCollection. Maar ik wil niet dat mijn inschrijfformulier pagina om daar opdagen.

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

De SiteMapNodeCollection.Remove()werkwijze gooit een

NotSupportedException: Collection is alleen-lezen.

Hoe kan ik het knooppunt uit de collectie te verwijderen voordat DataBinding de Repeater?

De vraag is gesteld op 15/08/2008 om 13:38
bron van user
In andere talen...                            


3 antwoorden

stemmen
1

Met behulp van Linq en .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 

Zonder Linq, maar met behulp van .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 )

Vermijd het verwijderen van items uit collecties zoals dat is altijd traag. Tenzij je gaat worden het doorlussen van meerdere keren ben je beter af filtering.

antwoordde op 15/08/2008 om 13:44
bron van user

stemmen
0

Ik heb het aan het werk met de code hieronder:

Dim children = From n In SiteMap.CurrentNode.ChildNodes _
               Where CType(n, SiteMapNode).Url <> "/Registration.aspx" _
               Select n
RepeaterSubordinatePages.DataSource = children

Is er een betere manier waar ik niet aan het te gebruiken CType()?

Ook dit stelt kinderen naar een System.Collections.Generic.IEnumerable(Of Object). Is er een goede manier om terug te krijgen iets sterker getypt als een System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)of zelfs beter een System.Web.SiteMapNodeCollection?

antwoordde op 15/08/2008 om 14:25
bron van user

stemmen
1

Je mag niet nodig CType

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
antwoordde op 15/08/2008 om 14:28
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more