문제

모든 항목을 나열하는 리피터가 있습니다. web.sitemap ASP.NET 페이지의 하위 페이지.그것은 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() 메소드는

NotSupported예외:"컬렉션은 읽기 전용입니다."

반복기를 데이터 바인딩하기 전에 컬렉션에서 노드를 제거하려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

CType이 필요하지 않습니다.

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

다른 팁

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 )

항상 느리기 때문에 컬렉션에서 항목을 제거하지 마십시오.여러 번 반복할 것이 아니라면 필터링하는 것이 좋습니다.

아래 코드로 작동하도록했습니다.

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?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top