Cum pot elimina nodurile dintr-un SiteMapNodeCollection?

Am un repetor care afișează toate paginile copil web.sitemap pe o pagină ASP.NET. Codul său DataSource este un SiteMapNodeCollection . Dar nu vreau ca pagina formularului de înregistrare să apară acolo.

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

Metoda SiteMapNodeCollection.Remove() aruncă o

NotSupportedException: "Colecția este numai pentru citire".

Cum pot elimina nodul din colecție înainte de îmbinarea datelor cu repetorul?

0
fr hi bn

3 răspunsuri

Am lucrat cu codul de mai jos:

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

Există o modalitate mai bună în care nu trebuie să utilizez CType() ?

De asemenea, acest lucru stabilește copiii la un System.Collections.Generic.IEnumerable (Of Object) . Există o modalitate bună de a obține înapoi ceva mai puternic introdus ca un System.Collections.Generic.IEnumerable (Of System.Web.SiteMapNode) sau chiar mai bine un System.Web.SiteMapNodeCollection ?

0
adăugat

Folosind Linq și .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 

Fără Linq, dar folosind .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 )

Evitați eliminarea elementelor din colecții, deoarece acestea sunt întotdeauna lente. Doar dacă nu vei mai face buclă de mai multe ori, ești mai bine să filtrezi.

0
adăugat

Dumneavoastră nu ar trebui să aveți nevoie de CType

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
0
adăugat