¿Cómo puedo quitar nodos de una SiteMapNodeCollection?
Pregunta
Tengo un Repetidor, que enumera todos los web.sitemap
niño páginas en una ASP.NET página.Su DataSource
es un SiteMapNodeCollection
.Pero, yo no quiero que mi página de formulario de registro para mostrar 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 lanza una
NotSupportedException:"La colección es de sólo lectura".
¿Cómo puedo eliminar el nodo de la colección antes de que el Enlace de datos, el Repetidor?
Solución
Tu no necesitas CType
Dim children = _
From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
Where n.Url <> "/Registration.aspx" _
Select n
Otros consejos
El uso de 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 utilizando .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 )
Evitar la eliminación de los elementos de las colecciones, ya que es siempre lenta.A menos que usted va a ser un bucle a través de varias veces que es mejor filtrado.
Yo tengo que trabajar con el código de abajo:
Dim children = From n In SiteMap.CurrentNode.ChildNodes _
Where CType(n, SiteMapNode).Url <> "/Registration.aspx" _
Select n
RepeaterSubordinatePages.DataSource = children
Hay una manera mejor, donde no tengo que usar el CType()
?
Además, esto pone a los niños a un System.Collections.Generic.IEnumerable(Of Object)
.Hay una buena manera de conseguir algo más inflexible como un System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)
o mejor aún, un System.Web.SiteMapNodeCollection
?