Сведения о вопросе

Gentleman

08:33, 7th August, 2020

Теги

asp.net   .net   vb.net   repeater   sitemap    

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

Просмотров: 465   Ответов: 3

У меня есть ретранслятор, который перечисляет все дочерние страницы 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() выбрасывает a

NotSupportedException: "Collection is read-only".

Как я могу удалить узел из коллекции до DataBinding повторителя?



  Сведения об ответе

lool

11:29, 19th August, 2020

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

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


  Сведения об ответе

dumai

16:16, 3rd August, 2020

Ваш не должен нуждаться CType

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


  Сведения об ответе

прога

21:06, 1st October, 2020

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

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 ?


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться