2009-05-18 1 views
1

Ich arbeite mit Datenbindung in ASP.Net 2.0, und ich bin auf ein Problem mit dem Befehl Eval gestoßen.Überschreiben von ToString für ein Objekt zur Verwendung in DataBinding

ich eine Klasse, die ich bin Datenbindung, sieht das wie folgt aus:

public class Address 
{ 
    public string Street; 
    public string City; 
    public string Country; 
    public new string ToString() 
    { 
     return String.Format("{0}, {1}, {2}", Street, City, Country); 
    } 
} 

Und eine andere Klasse (die, die ich bin Datenbindung zu):

public class Situation 
{ 
    public Address ObjAddress; 
    public string OtherInformation; 
} 

Nun, wenn ich eine datengebundene Kontrolle haben, z

<asp:DetailsView ID="dvSituation" DataSourceID="dataSourceThatPullsSituations" AutoGenerateRows="false"runat="server"> 
<EmptyDataTemplate> 
    No situation selected 
</EmptyDataTemplate> 
<Fields> 
    <asp:BoundField HeaderText="Other data" DataField="OtherInformation" /> 
    <asp:TemplateField> 
     <HeaderTemplate> 
      Address 
     </HeaderTemplate> 
     <ItemTemplate> 
      <%-- This will work --%> 
      <%# ((Situation)Container.DataItem).ObjAddress.ToString() %> 
      <%-- This won't --%> 
      <%# Eval("ObjAddress") %> 
     </ItemTemplate> 
    </asp:TemplateField> 
</Fields> 
</asp:DetailsView> 

Warum wird meine ToString() - Klasse nicht aufgerufen, wenn dieses Feld ausgewertet wird? Ich erhalte nur den Typnamen, wenn diese Prüfung ausgeführt wird.

Antwort

4

Anstelle der Verwendung:

public new string ToString() 

Mit der Überschreibung Stichwort:

public override string ToString() 
0

So war ich den Eindruck, dass die neue Keyword-Implementierungen auch außer Kraft setzen würde, wenn das Objekt aufgerufen wurde, als ob es sich um eine übergeordnete Klasse waren:

z.B.

Address test = new Address(); 
Object aFurtherTest = test; 
aFurtherTest.ToString(); 

Würde mich erfordern die neue Schlüsselwort zu verwenden. Mit diesem Schlüsselwort wird effektiv eine Methode erstellt, die denselben Namen wie die Basisklasse hat.

Also, wenn ich neue Schlüsselwort im obigen Beispiel verwendet, würde ich Objekt ToString-Methode erhalten. Mit anderen Worten würde die ToString-Methode abhängig vom Typ, den ich als Basisklasse oder Unterklasse behandelt habe, eine andere Methode aufrufen.

Offensichtlich ein Fall, wo ich RTFM haben sollte ...