Πώς μπορώ να αφαιρέσω κόμβους από SiteMapNodeCollection;

ψήφοι
1

Έχω ένα αναμεταδότη που απαριθμεί όλες τις 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: «Collection είναι μόνο για ανάγνωση».

Πώς μπορώ να αφαιρέσετε τον κόμβο από τη συλλογή πριν 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, αλλά χρησιμοποιώντας Καθαρά 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 )

Αποφύγετε την αφαίρεση αντικειμένων από τις συλλογές και αυτό είναι πάντα αργή. Αν δεν πρόκειται να looping μέσα πολλές φορές είστε σε καλύτερη θέση φιλτράρισμα.

Απαντήθηκε 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