Frage

Ich habe einen Repeater, der alles auflistet web.sitemap untergeordnete Seiten auf einer ASP.NET-Seite.Es ist DataSource ist ein SiteMapNodeCollection.Ich möchte jedoch nicht, dass meine Registrierungsformularseite dort angezeigt wird.

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

Der SiteMapNodeCollection.Remove() Methode wirft a

NotSupportedException:„Sammlung ist schreibgeschützt“.

Wie kann ich den Knoten aus der Sammlung entfernen, bevor ich den Repeater datenbind?

War es hilfreich?

Lösung

Sie sollten CType nicht benötigen

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n

Andere Tipps

Verwendung von Linq und .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 

Ohne Linq, aber mit .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 )

Vermeiden Sie das Entfernen von Elementen aus Sammlungen, da dies immer langsam ist.Sofern Sie nicht mehrere Male durchlaufen, ist es besser, zu filtern.

Ich habe es mit dem folgenden Code zum Laufen gebracht:

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

Gibt es einen besseren Weg, bei dem ich das nicht verwenden muss? CType()?

Dies setzt auch Kinder zu einem System.Collections.Generic.IEnumerable(Of Object).Gibt es eine gute Möglichkeit, etwas stärker Typisiertes wie a zurückzubekommen? System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode) oder noch besser ein System.Web.SiteMapNodeCollection?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top