Hvordan kan jeg fjerne noder fra en SiteMapNodeCollection?

stemmer
1

Jeg har en Repeater som viser alle web.sitemapunderordnede sider på en ASP.NET side. Dens DataSourceen SiteMapNodeCollection. Men, jeg vil ikke at min registreringsskjemaet for å dukke opp der.

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

Den SiteMapNodeCollection.Remove()metode kaster

NotSupportedException: Collection er skrivebeskyttet.

Hvordan kan jeg fjerne noden fra samlingen før databinding Repeater?

Publisert på 15/08/2008 klokken 12:38
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Bruke Linq og .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 

Uten Linq, men ved hjelp av 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 )

Unngå å fjerne elementer fra samlinger som det er alltid treg. Med mindre du kommer til å bli looping gjennom flere ganger er du bedre filtrering.

Svarte 15/08/2008 kl. 12:44
kilden bruker

stemmer
0

Jeg fikk det til å fungere med koden under:

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

Finnes det en bedre måte der jeg ikke trenger å bruke den CType()?

Dessuten setter dette barn til et System.Collections.Generic.IEnumerable(Of Object). Er det en god måte å få tilbake noe mer sterkt skrevet som en System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)eller enda bedre en System.Web.SiteMapNodeCollection?

Svarte 15/08/2008 kl. 13:25
kilden bruker

stemmer
1

Bør ikke trenger CTYPE

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
Svarte 15/08/2008 kl. 13:28
kilden bruker

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