DataTableってなれると結構なんだけど、これを継承することができるのを知ったので備忘録として残しておく。
ポイントはDataTable以外にDataRowについても継承し、DataTableについてはNewRow()とNewRowFromBuilder()メソッドをオーバーロード、DataRowについてはコンストラクタをオーバーライドする。
基本骨格をソースで示すとこうなる。
myDataRowクラス
Class myDataRow Inherits Global.System.Data.DataRow <global .system.diagnostics.debuggernonusercodeattribute=""> _ Friend Sub New(ByVal rb As Global.System.Data.DataRowBuilder) MyBase.New(rb) End Sub End Class
myDataTableクラス
Class myDataTable Inherits Global.System.Data.DataTable '<global .system.diagnostics.debuggernonusercodeattribute=""> _ Protected Overrides Function NewRowFromBuilder(ByVal builder As Global.System.Data.DataRowBuilder) As Global.System.Data.DataRow Return New myDataRow(builder) End Function Public Overloads Function NewRow() As DataRow Return MyBase.NewRow 'Return Activator.CreateInstance(GetType(DataRowEx), builder) End Function End Class
DataRowを継承すると何が便利かというとデータ行にユーザーデータを持たせられる。
Class myDataRow Inherits Global.System.Data.DataRow friend m_data as UserData '←ここ <global .system.diagnostics.debuggernonusercodeattribute=""> _ Friend Sub New(ByVal rb As Global.System.Data.DataRowBuilder) MyBase.New(rb) End Sub End Class
RowDataだけ継承すると自身をNewできないので都合が悪く結局DataTable:NewRow()メソッドが必要になる。
こんだけ知っておくだけでDataGridViewの表示管理がかなり改善されるかと思う。
ちなみに使い方は下記の通り。
Dim r As myDataRow Dim tb As New myDataTable r = tb.NewRow
以上