Jak mogę usunąć węzły z SiteMapNodeCollection?

głosy
1

Mam Repeater, który zawiera listę wszystkich web.sitemapstron dziecka na stronie ASP.NET. Jest DataSourceto SiteMapNodeCollection. Ale nie chcę, moja strona formularz rejestracyjny, aby pokazać się tam.

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()Sposób rzuca

NotSupportedException: „Kolekcja jest tylko do odczytu”.

Jak mogę usunąć węzeł z kolekcji przed Databinding repeater?

Utwórz 15/08/2008 o 13:38
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
1

Przy użyciu LINQ i .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 

Bez Linq, ale przy użyciu .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 )

Unikać usuwanie elementów z kolekcji, jak to zawsze wolna. Chyba że masz zamiar być zapętlenie poprzez wiele razy jesteś lepiej filtrowania.

Odpowiedział 15/08/2008 o 13:44
źródło użytkownik

głosy
0

Dostałem go do pracy z kodem poniżej:

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

Czy istnieje lepszy sposób, gdzie nie muszę używać CType()?

Również ten ustawia dzieci do System.Collections.Generic.IEnumerable(Of Object). Czy jest to dobry sposób, aby wrócić coś więcej jak silnie typami System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)lub nawet Lepszy System.Web.SiteMapNodeCollection?

Odpowiedział 15/08/2008 o 14:25
źródło użytkownik

głosy
1

Twój nie powinien potrzebować ctype

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
Odpowiedział 15/08/2008 o 14:28
źródło użytkownik

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