為支援 IEditableObject(交易)、IDataErrorInfo(驗證),需在 AddressRecord 維護永久/暫存資料雙份、錯誤雜湊表、容器參考,程式碼極其冗長(數頁)。且仍缺乏 IBindingList(排序、搜尋、列表變更通知)等介面,實作難度極高。
DataSet 原生支援:
ColumnChanged)SetColumnError、RowError)範例:
ds.Tables["Addresses"].ColumnChanged += ds_ColumnChanged;
private void ds_ColumnChanged(object sender, DataColumnChangeEventArgs e)
{
if (e.Column.ColumnName == "State")
{
string v = e.ProposedValue.ToString();
if (v.Length != 2) e.Row.SetColumnError(e.Column, "State abbreviation must be two letters");
else e.Row.SetColumnError(e.Column, "");
}
}
除非極度效能敏感或需極輕量格式,否則應優先使用型別化 DataSet。雖可能違背純 OO 設計,但開發效率遠勝手寫優美程式碼。