Como posso remover os nós de um SiteMapNodeCollection?

votos
1

Eu tenho um repetidor que lista todas as web.sitemappáginas filho em uma página ASP.NET. A sua DataSourceé uma SiteMapNodeCollection. Mas, eu não quero que a minha página de formulário de registro para mostrar lá em cima.

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

O SiteMapNodeCollection.Remove()método gera um

NotSupportedException: coleção é somente leitura.

Como posso remover o nó da coleção antes de ligação de dados do Repeater?

Publicado 15/08/2008 em 13:38
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

Usando 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 

Sem Linq, mas 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 )

Evite remover itens de coleções como isso é sempre lento. A menos que você estiver indo para ser um loop através de várias vezes você é melhor fora de filtragem.

Respondeu 15/08/2008 em 13:44
fonte usuário

votos
0

Eu tenho que trabalhar com código abaixo:

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

Existe uma maneira melhor, onde eu não tenho que usar o CType()?

Além disso, este define as crianças a um System.Collections.Generic.IEnumerable(Of Object). Existe uma boa maneira de voltar algo mais fortemente tipado como um System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)ou até melhor um System.Web.SiteMapNodeCollection?

Respondeu 15/08/2008 em 14:25
fonte usuário

votos
1

Seu não deve precisar CType

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
Respondeu 15/08/2008 em 14:28
fonte usuário

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