2010-06-23 27 views
5

Me gustaría crear un DataRow personalizado que tenga -digamos- una propiedad llamada IsCheapest.¿Cómo extender DataRow y DataTable en C# con propiedades y métodos adicionales?

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

    public bool IsCheapest { get; set ;} 
} 

Y yo quiero tener una nueva DataTable que contiene sólo *** *** s RateDataRow modo que .NewDataRow() devuelve ejemplo RateDataRow como una nueva fila.

¿Cuál debería ser la implementación en la clase que extiende DataTable?

Gracias,

Respuesta

0

de su pregunta no está claro si está familiarizado con los conjuntos de datos con tipo. Básicamente son lo que estás pidiendo.

Puede usar los asistentes incorporados para crear un conjunto de datos tipado basado en un XSD (y el XSD se extrae del esquema Db). En un proyecto de WinForms, seleccione "Agregar origen de datos" y siga los pasos.

Incluso si usted no desea utilizar ese modelo puede pedir prestado a partir del código de las propiedades, las clases parciales, etc.

sería prudente para cualquiera que use ese modelo o estar muy cerca de ella.

+0

Lo sentimos, pero esto no es una respuesta a la pregunta, sé que es tarde, pero esta es la primera entrada que la gente se encuentra en Google en relación con el tema. – Kodaloid

3

DataTable expone un método virtual GetRowType, anule esto en una clase derivada. Cualquier intento de añadir una fila de un tipo incorrecto será una excepción:

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

Sé que esto es un antiguo puesto ahora, pero no pude conseguir el ejemplo anterior para trabajar. Tenía un problema similar, por lo que estaba ansioso por encontrar una solución. Después de un poco de investigación he encontrado lo siguiente para trabajar:

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