Cum pot elimina nodurile dintr-o SiteMapNodeCollection?

voturi
1

Am un repetor care listează toate web.sitemappaginile de copii pe o pagină ASP.NET. Ei DataSourceeste SiteMapNodeCollection. Dar, nu vreau formular pagina mea de înregistrare pentru a apărea 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

SiteMapNodeCollection.Remove()Metoda aruncă o

NotSupportedException: Colectia este read-only.

Cum pot elimina nodul din colecția înainte de DataBinding repeater?

Întrebat 15/08/2008 la 13:38
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
1

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 ca e întotdeauna lent. Dacă nu vei fi looping prin mai multe ori esti mai bine de filtrare.

Publicat 15/08/2008 la 13:44
sursa de către utilizator

voturi
0

Am ajuns să lucreze 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 cazul în care nu trebuie să utilizați CType()?

De asemenea, acest lucru seturi de copii într - o System.Collections.Generic.IEnumerable(Of Object). Există o modalitate bună de a obține înapoi ceva mai puternic tastat ca un System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)sau chiar mai bine o System.Web.SiteMapNodeCollection?

Publicat 15/08/2008 la 14:25
sursa de către utilizator

voturi
1

Dvs. nu ar trebui să nevoie de CTYPE

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
Publicat 15/08/2008 la 14:28
sursa de către utilizator

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