1


0

SiteMapNodeCollectionからノードを削除する方法を教えてください。

私はASP.NETページ上のすべての web.sitemap`子ページをリストするRepeaterを持っています。 その `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: "コレクションは読み取り専用です"。 _

RepeaterをDataBindingする前にコレクションからノードを削除する方法を教えてください。

3 Answer


1


Linqと.Net 3.5を使う:

//this will now be an enumeration, rather than a read only collection
薄暗い子供= SiteMap.CurrentNode.ChildNodes.Where(_ Function(x)x.Url <> "/Registration.aspx")

RepeaterSubordinatePages.DataSource = children

Linqがなければ、.Net 2を使うと

ブール値としてのIsShown関数(SiteMapNodeとしてのn)戻り値n.Url <> "/Registration.aspx"終了関数

...

//get a generic list
List(Of SiteMapNode)= _として新しい子リスト(SiteMapNode)(SiteMap.CurrentNode.ChildNodes)

//use the generic list's FindAll method
RepeaterSubordinatePages.DataSource = children.FindAll(IsShown)

コレクションからアイテムを削除するのは、時間がかかるので避けてください。 何度もループすることになるのでなければ、フィルタリングすることをお勧めします。


1


CTypeは必要ないはず

子を薄暗くする= _ nからSiteMap.CurrentNode.ChildNodes.Cast(Of SiteMapNode)()_ここでn.Url <> "/Registration.aspx" _ nを選択


0


以下のコードで動作するようになりました。

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

CType()を使わなくてもよいもっと良い方法はありますか。

また、これはchildrenを `System.Collections.Generic.IEnumerable(Of Object)`に設定します。 `System.Collections.Generic.IEnumerable(Of System.Web.SiteMapNode)`のようにもっと強く型付けされたものを取り戻すための良い方法はありますか?それよりも `System.Web.SiteMapNodeCollection`ですか?