2010-06-23 12 views
5

Je voudrais créer un DataRow personnalisé qui aura une propriété nommée IsCheapest.Comment étendre DataRow et DataTable en C# avec des propriétés et méthodes supplémentaires?

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

    public bool IsCheapest { get; set ;} 
} 

Et je veux avoir une nouvelle DataTable qui contient seulement *** RateDataRow *** s de sorte que .NewDataRow() retourne exemple RateDataRow comme une nouvelle ligne.

Quelle devrait être l'implémentation de la classe qui étend DataTable?

Merci,

Répondre

0

De votre question, il ne sait pas si vous connaissez tapés datasets. Ils sont essentiellement ce que vous demandez.

Vous pouvez utiliser les assistants intégrés pour créer un dataset typé basé sur un XSD (et le XSD est extrait du schéma Db). Dans un projet WinForms, sélectionnez "Ajouter DataSource" et suivez les étapes.

Même si vous ne voulez pas utiliser ce modèle que vous pouvez emprunter à partir du code des propriétés, des classes partielles, etc.

Il serait sage d'utiliser soit ce modèle ou de rester très proche.

+0

Désolé, mais ce n'est pas une réponse à la question, je sais qu'il est tard, mais c'est la première entrée que les gens trouveront sur Google portant sur le sujet. – Kodaloid

3

Le DataTable expose une méthode virtuelle GetRowType, redéfinir cela dans une classe dérivée. Toute tentative d'ajouter une ligne du mauvais type va lancer une exception:

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

Je sais que c'est un ancien poste maintenant, mais je ne pouvais pas l'exemple ci-dessus pour travailler. J'ai eu un problème similaire, donc je tenais à trouver une solution. Après un peu de recherche, j'ai trouvé ce qui suit pour travailler:

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) 
    { 
    } 
}