繁体   English   中英

如何使用其他属性和方法在C#中扩展DataRow和DataTable?

[英]How to extend DataRow and DataTable in C# with additional properties and methods?

我想创建一个自定义的DataRow,它将具有-let的说法 - 一个名为IsCheapest的软件。

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

    public bool IsCheapest { get; set ;}
}

我想要一个只包含*** RateDataRow ***的新DataTable,以便.NewDataRow()将RateDataRow实例作为新行返回。

什么应该是扩展DataTable的类的实现?

谢谢,

我知道这是一个旧帖子,但我无法得到上面的例子。 我遇到了类似的问题,所以很想找到解决方案。 经过一番研究后,我发现以下内容有效:

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

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

根据您的问题,您是否熟悉Typed Datasets并不清楚。 它们基本上就是你要求的。

您可以使用内置向导基于XSD创建类型化数据集(并且从Db架构中提取XSD)。 在WinForms项目中,选择“添加数据源”并按照步骤操作。

即使您不想使用该模型,也可以从属性,部分类等代码中借用。

使用该模型或保持非常接近是明智的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM