使用類型DataSet
尋找更多的信息,要做到這一點的最好辦法。但在某些情況下,您可能不想或不能這樣做。例如,您可能需要屬性爲可空類型,其類型爲DataSet
不支持。 (在輸入DataSet
,每個空列也有Set<ColumnName>Null
和Is<ColumnName>Null
方法,這是非常可怕的。)
在這種情況下,要採取幾乎相同的做法,即鍵入DataSet
需要:子類DataRow
和實施在那裏的屬性,例如:
public class MyDataRow : DataRow
{
public DateTime? SomeDate
{
get
{
return (this["SomeDate"] is DBNull)
? (DateTime?)null
: this.Field<DateTime>("SomeDate");
}
set
{
if (value == null)
{
this["SomeDate"] = DBNull.Value;
}
else
{
this["SomeDate"] = value;
}
}
}
}
有兩件事情使這變得複雜,它們與如何構建新行有關。首先,你必須實現在MyDataTable
一個構造函數調用基類的構造:
public MyDataRow(DataRowBuilder rb) : base(rb) { }
其次(這是令人困惑的部分),你還必須繼承DataTable
並重寫NewRowFromBuilder
方法。這使得NewRow
方法返回一個DataRow
對象,該對象實際上是一個MyDataRow
對象(因爲NewRow
調用NewRowFromBuilder
)。如果不這樣做,NewRow
將調用基類的NewRowFromBuilder
實現,它將返回DataRow
,並且您需要它返回MyDataRow
。
public class MyDataTable : DataTable
{
protected override DataRow NewRowFromBuilder(DataRowBuilder builder)
{
return new MyDataRow(builder);
}
}
然後在代碼中創建這些對象,你有這樣的事情:
MyDataTable t = new MyDataTable();
MyDataRow r = (MyDataRow) t.NewRow();
請注意,您還是得NewRow
將返回值(因爲NewRow
總是返回DataRow
類型的對象)。
如果您需要處理MyDataTable
上的事件,您需要重寫事件處理程序,並讓它們在MyDataRow
對象中引發事件。真的,你應該看看生成的代碼鍵入DataSet
看看這是如何工作的。
您是否在嘗試創建自己的強類型數據集? – 2009-08-07 15:23:30
我不認爲我理解你,你描述的與DataTable和DataRow的默認行爲有什麼不同? – 2009-08-07 15:27:30
您正在使用哪種版本的.NET框架? – 2009-08-07 15:35:26