Как я могу удалить узлы из SiteMapNodeCollection?

голоса
1

У меня есть Repeater , в котором перечислены все web.sitemapдочерние страницы на странице ASP.NET. Его DataSourceэто SiteMapNodeCollection. Но я не хочу , чтобы моя форма регистрации страницы , чтобы показать там.

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()Метод бросает

NotSupportedException: «Коллекция только для чтения».

Как я могу удалить узел из коллекции, прежде чем Databinding ретранслятора?

Задан 15/08/2008 в 13:38
источник пользователем
На других языках...                            


3 ответов

голоса
1

Использование Linq и .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 

Без Linq, но с использованием .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 )

Избегайте удаления предметов из коллекций, как это всегда медленно. Если вы не собираетесь быть перекручивание через несколько раз вы лучше фильтрации.

Ответил 15/08/2008 в 13:44
источник пользователем

голоса
0

Я получил его на работу с кодом ниже:

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

Есть ли лучший способ , где я не должен использовать CType()?

Кроме того , это ставит детей к System.Collections.Generic.IEnumerable(Of Object). Есть хороший способ получить обратно что - то более сильно типизированных подобно System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)или даже Чем лучше System.Web.SiteMapNodeCollection?

Ответил 15/08/2008 в 14:25
источник пользователем

голоса
1

Вы не должны CType

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
Ответил 15/08/2008 в 14:28
источник пользователем

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