2009-03-10 12 views
0

Ich habe diese folgende Datenquelle Bindung:Warum funktioniert diese Datenbindung in aspx nicht?

MembershipProvider provider = new MembershipProvider(); 
UserUpdateLogs userUpdateLogs = provider.GetUserUpdateLogs(username); 

dgUserUpdateLog.DataSource = userUpdateLogs.Logs; 
dgUserUpdateLog.DataBind(); 

Logs ist eine Sammlung von UserUpdateLogEntry. Diese Klasse besitzt die UserData-Eigenschaft, und UserData enthält andere Eigenschaften. Mein aspx:

<Columns> 
<asp:BoundColumn DataField="ChangeDate" Visible="true" HeaderText="Date"/> 
<asp:BoundColumn DataField="UserData.Sex" HeaderText="Sex" /> 
<asp:BoundColumn DataField="UserData.Phone" HeaderText="Phone" /> 
</Columns> 

Die erste Zeile (Änderungsdatum) scheint gut zu funktionieren. Aber wenn die zweite gebundene Spalte Rendering, wird die folgenden Fehler angezeigt:

Ein Feld oder eine Eigenschaft mit dem Namen ‚UserData.Sex‘ wurde nicht auf der Quelle ausgewählten Daten gefunden.

Warum passiert das? Kann Aspx eine Verkettung von Eigenschaften wie PropertyA.PropertyB nicht erkennen?

Ich habe das Objekt überprüft und alle Eigenschaften haben gültige Daten.

Antwort

3

Sie können auf diese Weise nicht an Eigenschaften von Unterobjekten binden.

Alternativ können Sie eine Vorlagenspalte verwenden und Eval verwenden, um die Eigenschaften des Unterobjekts anzuzeigen, z. so etwas wie diese:

<asp:TemplateColumn HeaderText="Sex" Visible="true"> 
    <ItemTemplate> 
    <asp:Literal runat="server" Text='<%# Eval("UserData.Sex") %>' /> 
    </ItemTemplate> 
</asp:TemplateColumn> 
<asp:TemplateColumn HeaderText="Phone" Visible="true"> 
    <ItemTemplate> 
    <asp:Literal runat="server" Text='<%# Eval("UserData.Phone") %>' /> 
    </ItemTemplate> 
</asp:TemplateColumn> 
1

C# Reflexion verwendet für eine Eigenschaft suchen UserData.Sex genannt wird, ist es nicht klug genug für UserData zu suchen und dann Sex.
Also die Antwort auf Ihre Frage ist "Nein".

Es gibt mehrere Möglichkeiten, dies zu umgehen, aber die elegantere Methode besteht darin, entweder eine Eigenschaft UserSex hinzuzufügen oder das Objekt in eine Datentabelle zu glätten. Im Moment kann ich mir keinen guten Weg vorstellen, der OO nicht bricht.

1

Ich bin mir nicht sicher, was Ihnen sagen, warum es nicht funktionieren wird, aber eine Abhilfe zu schreiben dies könnte einigen linq2objects zu benutzen:

dgUserUpdateLog.DataSource = (from n in userUpdateLogs.Logs select new {n.ChangeDate, Sex=n.Userdata.Sex, Phone=n.UserData.Phone}); 

dann:

<Columns> 
<asp:BoundColumn DataField="ChangeDate" Visible="true" HeaderText="Date"/> 
<asp:BoundColumn DataField="Sex" HeaderText="Sex" /> 
<asp:BoundColumn DataField="Phone" HeaderText="Phone" /> 
</Columns> 
+0

Ich benutze .net 2.0, sonst könnte es ein guter Workaround sein, danke! –

2

eine Sache, die Sie tun können, ist eine Accessor-Eigenschaft erstellen:

public string UserSex 
{ 
    get { return userUpdateLogs.Logs.UserData.Sex; } 
} 
Verwandte Themen