سؤال

لقد حصلت على مكرر يسرد كافة web.sitemap الصفحات الفرعية على صفحة ASP.NET.إنه 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() طريقة يلقي أ

استثناء غير مدعوم:"المجموعة للقراءة فقط".

كيف يمكنني إزالة العقدة من المجموعة قبل DataBinding the Repeater؟

هل كانت مفيدة؟

المحلول

لا ينبغي أن تحتاج إلى 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