2016-03-24 11 views
0

Bu yorum aşağıda bir yorum yapılmadı, ama yanımızda kalması gerekecek galiba. Göndermeden önce yardım ararken aradığım kopyasını buldum. Buradaki açıklama, kopyadan daha fazla izlemem için daha kolaydı.Varsayılı üye bulunamadı Parcel

Aşağıdaki kodu çalıştırdığımda, ParcelsRepeater.DataSource = Split.Parcels komutunu çalıştırdıktan hemen sonra "Parcel türü için varsayılan üye bulunamadı" hatası alıyorum. Hata iletisi, aspx kodunda <% # Container.DataItem ("PIN")%> vurgulanıyor gibi görünüyor.

Hiçbir zaman ItemDataBound olayı vurmak gibi görünüyor.

<%#Container.DataItem("PIN")%> 

Bu ParcelsRepeater_ItemDataBound önce veri bağlama parçası olarak ele alınır olarak oluşur:

Imports System.Linq 


Public Class SplitCreateParcels 
Inherits System.Web.UI.Page 

Public Class SplitParcel 

    Public Sub New() 
     Parcels = New List(Of Parcel) 
    End Sub 


    Public Property Parcels As List(Of Parcel) 

End Class 

Public Class Cat 
    Public Property Category As String 
End Class 

Public Class Parcel 

    Public Sub New() 
     Categories = New List(Of Cat) 
    End Sub 
    Public Property PIN As String 
    Public Property Categories As List(Of Cat) 
End Class 

Public Property _Split As SplitParcel 


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    Dim Split As New SplitParcel 
    Dim Parcel1 As New Parcel 
    Dim Parcel2 As New Parcel 


    Split.Parcels.Add(Parcel1) 
    Split.Parcels.Add(Parcel2) 

    Parcel1.PIN = "Test1" 
    Parcel1.Categories.Add(New Cat With {.Category = "1"}) 
    Parcel1.Categories.Add(New Cat With {.Category = "2"}) 

    Parcel2.PIN = "Test2" 
    Parcel2.Categories.Add(New Cat With {.Category = "3"}) 
    Parcel2.Categories.Add(New Cat With {.Category = "4"}) 

    ParcelsRepeater.DataSource = Split.Parcels 
    ParcelsRepeater.DataBind() 


End Sub 

Protected Sub ParcelsRepeater_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) 
    If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then 
     Dim ParentDataItem As Parcel = DirectCast(e.Item.DataItem, Parcel) 


     Dim ChildRepeater As Repeater = DirectCast(e.Item.FindControl("IntegerRepeater"), Repeater) 
     ChildRepeater.DataSource = ParentDataItem.Categories 
     ChildRepeater.DataBind() 



    End If 
End Sub 
End Class 



<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="SplitCreateParcels.aspx.vb" Inherits="UADWeb.SplitCreateParcels" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

     <asp:Repeater ID="ParcelsRepeater" runat="server" OnItemDataBound="ParcelsRepeater_ItemDataBound"> 
      <ItemTemplate> 
       <%#Container.DataItem("PIN")%> 
       <asp:Repeater runat="server" ID="IntegerRepeater"> 
        <ItemTemplate> 
         <%#Container.DataItem("Category")%></br> 
        </ItemTemplate> 
       </asp:Repeater> 
      </ItemTemplate> 
     </asp:Repeater> 
    </div> 
    </form> 
</body> 
</html> 
+0

Olası yinelenen ParcelsRepeater_ItemDataBound ile. NET Tekrarlayıcı Hatası: xx için varsayılan üye bulunamadı] (http://stackoverflow.com/questions/9673445/asp-net-repeater-error-no-default-member-found-for-type-xx) –

cevap

2

Ben senin sorunun bu hat olduğuna inanıyoruz.

Kodunuzda daha önce de belirttiğiniz gibi, özelliklere erişmek için DataItem'inizi doğru türüne göndermeniz gerekir. Aşağıdaki çalışması gerekir:

<%#DirectCast(Container.DataItem, [Namespaced Path To your Type].Parcel).PIN%> 

Çünkü kod mark-up vs codebehind işlenme şeklinin farklılıkları sizin Parsel tipi tam yolunu sağlamak için gereklidir. Bu sözdizimine bir alternatif olarak, can view this Q&A.

farklı bir çözüm olarak, sadece madde şablonuna bir hazır ekleyebilir ve kod arkasında metin var doldurabilirsiniz:

sonra
<asp:Repeater ID="ParcelsRepeater" runat="server" 
    OnItemDataBound="ParcelsRepeater_ItemDataBound"> 
    <ItemTemplate> 
    <asp:Literal Text="" ID="Pin" runat="server" /> 
    ... 

[ASP

Dim ParentDataItem = DirectCast(e.Item.DataItem, Parcel) 
Dim PinLiteral = DirectCast(e.Item.FindControl("Pin"), Literal) 
PinLiteral.Text = ParentDataItem.PIN 
... 
+0

o. Zaman ayırdığınız için çok teşekkürler. – Tyddlywink