キャンペーン


2015年3月21日土曜日

DataTableの継承 - VB.NET 編


久しぶりに書く気がする。

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


以上