¿Cómo puedo eliminar nodos de un SiteMapNodeCollection?

votos
1

Tengo un repetidor que enumera todas las web.sitemappáginas secundarias en una página ASP.NET. Su DataSourcees una SiteMapNodeCollection. Pero, no quiero que mi página de formulario de registro aparezca allí.

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

El SiteMapNodeCollection.Remove()método arroja un

NotSupportedException: La colección es de solo lectura.

¿Cómo puedo eliminar el nodo de la colección antes de vincular el Repetidor?

Publicado el 15/08/2008 a las 13:38
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
1

Usando Linq y .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 

Sin Linq, pero usando .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 )

Evite eliminar elementos de las colecciones, ya que siempre es lento. A menos que vayas a realizar múltiples iteraciones, es mejor que te filtres.

Respondida el 15/08/2008 a las 13:44
fuente por usuario

votos
0

Lo tengo para trabajar con el código a continuación:

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

¿Hay una mejor manera en la que no tengo que usar el CType()?

Además, esto establece que los niños a System.Collections.Generic.IEnumerable(Of Object). ¿Hay una buena manera de recuperar algo escrito con más fuerza como una System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)o incluso mejor System.Web.SiteMapNodeCollection?

Respondida el 15/08/2008 a las 14:25
fuente por usuario

votos
1

Tu no debería necesitar CType

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
Respondida el 15/08/2008 a las 14:28
fuente por usuario

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