Как расширить DataRow и DataTable в C # с помощью дополнительных свойств и методов? - PullRequest
5 голосов
/ 23 июня 2010

Я хотел бы создать собственный DataRow, который будет иметь, скажем, свойство IsCheapest.

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

    public bool IsCheapest { get; set ;}
}

И я хочу иметь новый DataTable, который содержит только *** RateDataRow *** s, чтобы .NewDataRow () возвращал экземпляр RateDataRow в качестве новой строки.

Какой должна быть реализация класса, расширяющего DataTable?

Спасибо

Ответы [ 3 ]

10 голосов
/ 07 ноября 2011

Я знаю, что это старый пост, но я не смог заставить работать приведенный выше примерУ меня была похожая проблема, поэтому я стремился найти решение.После небольшого исследования я нашел следующее:

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)
    {
    }
}
4 голосов
/ 23 июня 2010

DataTable предоставляет виртуальный метод GetRowType, переопределяя его в производном классе.Любые попытки добавить строку неправильного типа приведут к исключению:

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)
    { }
}
0 голосов
/ 23 июня 2010

Из вашего вопроса не ясно, знакомы ли вы с Типизированными наборами данных.В основном это то, о чем вы просите.

Вы можете использовать встроенные мастера для создания набора типизированных данных на основе XSD (а XSD извлекается из схемы Db).В проекте WinForms выберите «Добавить источник данных» и следуйте инструкциям.

Даже если вы не хотите использовать эту модель, вы можете позаимствовать из кода свойства, частичные классы и т. Д.

Было бы разумно либо использовать эту модель, либо оставаться очень близко к ней.

...