我有一个Repeater,它列出了ASP.NET页面上的所有web.sitemap
子页面。其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:“集合是只读的”。
如何在DataBinding Repeater之前从集合中删除节点?
答案 0 :(得分: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 )
避免从集合中删除项目,因为它总是很慢。除非你要多次循环,否则最好不要过滤。
答案 1 :(得分:1)
您不应该需要CType
Dim children = _
From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
Where n.Url <> "/Registration.aspx" _
Select n
答案 2 :(得分: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
?