如何从 SiteMapNodeCollection 中删除节点?

How can I remove nodes from a SiteMapNodeCollection?

提问人:Zack Peterson 提问时间:8/15/2008 最后编辑:Patrick D'SouzaZack Peterson 更新时间:4/28/2013 访问量:4072

问:

我有一个 Repeater,它列出了 ASP.NET 页面上的所有子页面。它是一个.但是,我不希望我的注册表单页面显示在那里。web.sitemapDataSourceSiteMapNodeCollection

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:“集合是只读的”。

如何在对中继器进行数据绑定之前从集合中删除节点?

asp.net .NET vb.net Repeater 站点地图

评论


答:

1赞 Keith 8/15/2008 #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 )

避免从集合中删除项目,因为这总是很慢。除非你要多次循环,否则你最好进行过滤。

0赞 Zack Peterson 8/15/2008 #2

我让它使用下面的代码:

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

有没有更好的方法让我不必使用 ?CType()

此外,这会将子项设置为 .有没有一种好方法可以找回更强类型的东西,比如 a 甚至更好的 a?System.Collections.Generic.IEnumerable(Of Object)System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)System.Web.SiteMapNodeCollection

1赞 Keith 8/15/2008 #3

你不需要 CType

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