Come posso rimuovere nodi da un SiteMapNodeCollection?

voti
1

Ho un ripetitore che elenca tutte le web.sitemappagine figlio in una pagina ASP.NET. La sua DataSourceè una SiteMapNodeCollection. Ma, non voglio che la mia pagina modulo di registrazione per mostrare lassù.

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

Il SiteMapNodeCollection.Remove()metodo genera un

NotSupportedException: Collection è di sola lettura.

Come faccio a rimuovere il nodo dalla raccolta, prima associazione dati del ripetitore?

È pubblicato 15/08/2008 alle 13:38
fonte dall'utente
In altre lingue...                            


3 risposte

voti
1

Utilizzando LINQ e .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 

Senza LINQ, ma utilizzando .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 )

Evitare la rimozione di elementi da collezioni come quello è sempre lento. A meno che non si sta andando ad essere scorrendo più volte è meglio filtraggio.

Risposto il 15/08/2008 a 13:44
fonte dall'utente

voti
0

Ho preso a lavorare con codice qui sotto:

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

C'è un modo migliore in cui io non devo usare il CType()?

Inoltre, questo imposta i bambini ad una System.Collections.Generic.IEnumerable(Of Object). C'è un buon modo per tornare qualcosa di più fortemente tipizzato come un System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)o meglio ancora una System.Web.SiteMapNodeCollection?

Risposto il 15/08/2008 a 14:25
fonte dall'utente

voti
1

Il vostro non dovrebbe avere bisogno di CType

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
Risposto il 15/08/2008 a 14:28
fonte dall'utente

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