2010-06-23 7 views
5

Ich möchte eine benutzerdefinierte DataRow erstellen, die - sagen wir - eine Property namens IsCheapest hat.Wie DataRow und DataTable in C# mit zusätzlichen Eigenschaften und Methoden zu erweitern?

public class RateDataRow : DataRow 
{ 
    protected internal RateDataRow(DataRowBuilder builder) : base(builder) 
    { 
    } 

    public bool IsCheapest { get; set ;} 
} 

Und ich möchte eine neue Datentabelle haben, die nur enthält *** RateDataRow *** s, so dass .NewDataRow() gibt RateDataRow Instanz als neue Zeile.

Was sollte die Implementierung in der Klasse sein, die DataTable erweitert?

Danke,

Antwort

0

Aus Ihrer Frage ist es nicht klar, ob Sie mit typisierten Datasets vertraut sind. Sie sind im Grunde das, wonach Sie fragen.

Sie können die integrierten Assistenten verwenden, um ein typisiertes Dataset basierend auf einem XSD zu erstellen (und das XSD wird aus dem DB-Schema extrahiert). Wählen Sie in einem WinForms-Projekt "Add DataSource" und folgen Sie den Schritten.

Auch wenn Sie nicht über dieses Modell verwenden mögen, um aus dem Code Objekte ausleihen könnten, partielle Klassen usw.

wäre es klug, entweder dieses Modell zu verwenden, oder sehr nahe dran bleiben.

+0

Sorry, aber das ist keine Antwort auf die Frage, ich weiß, es ist spät, aber dies ist der erste Eintrag, dass die Menschen auf Google in Bezug auf das Thema finden. – Kodaloid

3

Die DataTable macht eine virtuelle GetRowType-Methode verfügbar, die in einer abgeleiteten Klasse überschrieben wird. Alle Versuche, eine Reihe von falschen Typ hinzufügen wird eine Ausnahme werfen:

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyDataTable t = new MyDataTable(); 
     t.Rows.Add(t.NewRow()); // <-- Exception here, wrong type (base doesn't count). 
    } 
} 

public class MyDataTable : DataTable 
{ 
    public MyDataTable() 
     : base() 
    { } 

    protected override Type GetRowType() 
    { 
     return typeof(MyDataRow); 
    } 
} 

public class MyDataRow : DataRow 
{ 
    public MyDataRow() 
     : base(null) 
    { } 
} 
9

Ich weiß, das ist eine alte Post jetzt aber ich konnte nicht das Beispiel erhalten oben zu arbeiten. Ich hatte ein ähnliches Problem und wollte unbedingt eine Lösung finden. Nach einem wenig Recherche fand ich folgende zu arbeiten:

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyDataTable t1 = new MyDataTable(); 

     t1.Columns.Add(new DataColumn("Name", typeof(string))); 
     t1.Columns.Add(new DataColumn("DateOfBirth", typeof(DateTime))); 

     MyDataRow r1 = t1.NewRow() as MyDataRow; 
     r1["Name"] = "Bob"; 
     r1["DateOfBirth"] = new DateTime(1970, 5, 12); 
     t1.Rows.Add(r1); 
    } 
} 

[Serializable] 
public class MyDataTable : DataTable 
{ 
    public MyDataTable() 
     : base() 
    { 
    } 

    public MyDataTable(string tableName) 
     : base(tableName) 
    { 
    } 

    public MyDataTable(string tableName, string tableNamespace) 
     : base(tableName, tableNamespace) 
    { 
    } 

    /// <summary> 
    /// Needs using System.Runtime.Serialization; 
    /// </summary> 
    public MyDataTable(SerializationInfo info, StreamingContext context) 
     : base(info, context) 
    { 
    } 

    protected override Type GetRowType() 
    { 
     return typeof(MyDataRow); 
    } 

    protected override DataRow NewRowFromBuilder(DataRowBuilder builder) 
    { 
     return new MyDataRow(builder); 
    } 
} 

[Serializable] 
public class MyDataRow : DataRow 
{ 
    public bool MyPropertyThatIdicatesSomething { get; private set; } 

    public MyDataRow() 
     : base(null) 
    { 
    } 

    public MyDataRow(DataRowBuilder builder) 
     : base(builder) 
    { 
    } 
} 
Verwandte Themen