1

web.sitemapASP.NET ページのすべての子ページを一覧表示する Repeater があります。それDataSourceSiteMapNodeCollectionです。しかし、登録フォームのページをそこに表示したくありません。

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 する前に、コレクションからノードを削除するにはどうすればよいですか?

4

3 に答える 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 なしで、.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 )

コレクションからのアイテムの削除は常に遅いため、避けてください。複数回ループするつもりでない限り、フィルタリングしたほうがよいでしょう。

于 2008-08-15T14:44:45.380 に答える
1

CType は必要ありません

Dim children = _
    From n In SiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)() _
    Where n.Url <> "/Registration.aspx" _
    Select n
于 2008-08-15T15:28:40.987 に答える
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)aまたはさらに良い a のように、より強く型付けされたものを返す良い方法はありSystem.Web.SiteMapNodeCollectionますか?

于 2008-08-15T15:25:15.547 に答える