我想创建一个自定义的DataRow,它将有一个名为IsCheapest的名称。
public class RateDataRow : DataRow
{
protected internal RateDataRow(DataRowBuilder builder) : base(builder)
{
}
public bool IsCheapest { get; set ;}
}
我想要一个只包含*** RateDataRow ***的新DataTable,以便.NewDataRow()将RateDataRow实例作为新行返回。
扩展DataTable的类的实现应该是什么?
谢谢,
答案 0 :(得分:10)
我知道这是一个旧帖子,但我无法让上面的例子工作。我遇到了类似的问题,所以很想找到解决方案。经过一番研究后,我发现以下内容有效:
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)
{
}
}
答案 1 :(得分:4)
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)
{ }
}
答案 2 :(得分:0)
根据您的问题,您是否熟悉Typed Datasets并不清楚。它们基本上就是你要求的。
您可以使用内置向导基于XSD创建类型化数据集(并且从Db架构中提取XSD)。在WinForms项目中,选择“Add DataSource”并按照步骤进行操作。
即使您不想使用该模型,也可以从属性,部分类等代码中借用。
使用该模型或保持非常接近是明智的。