2014-11-05 10 views
0

Есть ли способ сохранить пользовательский объект в DataRow или DataColumn?Есть ли способ сохранить пользовательский объект в DataRow или DataColumn?

В основном я ищу эквивалент свойства тега для DataRow или DataColumn. Я просмотрел ExtendedProperties для DataColumn, но вы можете хранить там только строки.

drNewPathRow = dsOutputGrid.Tables("dtPathElements").Rows.Add() 
    elm = pth.Elements(iElements) 
    drNewPathRow(0) = elm.Name 

    ' drNewPathRow.tag = elm .... I wish! 
+1

Вы можете добавить новый столбец и хранить его там. –

ответ

1
dt.Columns.Add("objCol", GetType(Object)) 

Я не знал, что я мог сделать это. Спасибо thelot за вашу помощь.

0

простой способ - создать новый столбец, предложенный @the_lotus. Но если вы хотите сделать это трудным способом, тогда вам нужно создать пользовательскую таблицу, наследуя класс TypedTableBase(Of T). Возможно, вам придется переопределить/перегрузить/затенять дополнительные свойства/методы, которые будут показаны в следующем примере, однако вам следует начать работу.

Public Class StorageTable 
    Inherits TypedTableBase(Of StorageRow) 

    Protected Overrides Function CreateInstance() As DataTable 
     Return New StorageTable() 
    End Function 

    Protected Overrides Function NewRowFromBuilder(builder As DataRowBuilder) As DataRow 
     Return New StorageRow(builder) 
    End Function 

    Protected Overrides Function GetRowType() As Type 
     Return GetType(StorageRow) 
    End Function 

End Class 

Public Class StorageRow 
    Inherits DataRow 

    Protected Friend Sub New(builder As DataRowBuilder) 
     MyBase.New(builder) 
    End Sub 

    Public Property Tag() As Object 

End Class 

Простой тест:

Using table As New StorageTable() 
    table.Columns.Add("Column1", GetType(String)) 
    table.Rows.Add("value1") 
    Dim row As StorageRow = DirectCast(table.Rows(0), StorageRow) 
    row.Tag = "value2" 
    Debug.WriteLine("Column1={0}, Tag={1}", row.Item(0), row.Tag) 
End Using 

Выход:

Column1 = value1, Tag = значение2