Esta vez veremos como pasar un DTO a un Datatable de solo 1 registro, y veremos tambien la situacion de pasar una coleccion de DTOs a un Datatable usando System.Reflection.
Este ejemplo lo hare con un DTO muy sencillito de tan solo 2 campos: IdCliente, Desccliente.
Primero rellenare el DTO.
Dim Ndto As New Dto.DtoCliente Ndto.DescCliente = "PEPE" Ndto.IdCliente = "101"Bien ahora vamos a crear una funcion que nos devuelva un Array de String la llamare GetCampos()
Que quedara de la siguiente manera.
Private Function GetCampos(ByVal Dto) As String()
'Array de string que devolvera los campo
Dim Str(-1) As String
For Each Prop As PropertyInfo In DirectCast(Dto, Object).GetType.GetProperties
ReDim Preserve Str(UBound(Str) + 1)
Str(UBound(Str)) = Prop.Name
Next
Return Str
End Function
Bien ahora creamos la funcion que nos devolvera el Datatable , A esta funcion le tendremos que pasar los campos y el Dto. Private Function GetDataTable(ByVal Campos(), ByVal DTO) As DataTable
Dim Dt As New DataTable
For i As Integer = 0 To Campos.Count - 1
Dt.Columns.Add(Campos(i))
Next
Dim Dr As DataRow = Dt.NewRow
For Each Dc As DataColumn In Dt.Columns
Dr(Dc.ColumnName) = DTO.GetType.InvokeMember(Dc.ColumnName, BindingFlags.GetProperty, Nothing, DTO, Nothing)
Next
Dt.Rows.Add(Dr)
Return Dt
End Function
y listo solo queda hacer la llamada para que devuelva un Datatable con 1 row.
Dim DtotoDatatable As DataTable = GetDataTable(misCampos, Ndto)
Aprovechado el primer DTO vamos a hacer una coleccion de DTOs y lo traspasaremos a un datatable.
Creamos la coleccion y añadimos.
Dim MiColeccion As New Collection
'añado el primer dto y creo otro
MiColeccion.Add(Ndto)
Ndto = New Dto.DtoCliente
Ndto.IdCliente = "102"
Ndto.DescCliente = "JUAN"
MiColeccion.Add(Ndto)
Ahora a la funcion GetCampos le pasamos el primer DTO de la coleccion.Dim CamposDeMiColeccion() As String = GetCampos(MiColeccion(1))
Creamos una nueva funcion para pasarle la coleccion y los campos, y que nos devuelva el datatable.
Private Function GetDataTableColeccion(ByVal Campos() As String, ByVal Coleccion As Collection) As DataTable
Dim Dt As New DataTable
''Campos sigue siendo igual.
For i As Integer = 0 To Campos.Count - 1
Dt.Columns.Add(Campos(i))
Next
'' recorremos la coleccion y vamos sacando los DTOs
For i As Integer = 1 To Coleccion.Count
Dim Dto = Coleccion(i)
'' Ya tenemos los campos en nuestro datatable ahora lo rellenamos
Dim Dr As DataRow = Dt.NewRow
'recorro las columnas para ir rellenado los valores que tiene el DTO.
For Each Dc As DataColumn In Dt.Columns
Dr(Dc.ColumnName) = Dto.GetType.InvokeMember(Dc.ColumnName, BindingFlags.GetProperty, Nothing, Dto, Nothing)
Next
'y lo añado a el datatable
Dt.Rows.Add(Dr)
Next
Return Dt
End Function
Y listo, ya tenemos el datatable con la coleccion de DTOs. Hacemos la llamada pertinente.
Dim miDatatable As DataTable = GetDataTableColeccion(CamposDeMiColeccion, MiColeccion)
Os dejo el codigo fuente completo del ejemplo Comentado.
Imports System.Reflection
Public Class DTOtoDT
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
''Este Dto es un ejemplo sencillo con solo 2 campos uno Idcliente y Otro Desccliente.
Dim Ndto As New Dto.DtoCliente
Ndto.DescCliente = "PEPE"
Ndto.IdCliente = "101"
''primer ejemplo para dto
''Vamos a crear ahora una funcion que nos devuelva las propiedades del DTO.
''que seran los campos del Datatable que vamos a crear deberemos tener importada
''la referencia de system.Reflection.
''Lo que voy a hacer es devolverlos en un array de String
Dim misCampos() As String = GetCampos(Ndto)
Dim DtotoDatatable As DataTable = GetDataTable(misCampos, Ndto)
'' ahora creare una funcion que me devuelva el Datatable con los campos del Array y los datos del DTO
Dim MiColeccion As New Collection
'añado el primer dto y creo otro
MiColeccion.Add(Ndto)
Ndto = New Dto.DtoCliente
Ndto.IdCliente = "102"
Ndto.DescCliente = "JUAN"
MiColeccion.Add(Ndto)
''Nuestra Coleccion tiene ahora 2 DTOs y lo vamos a pasar nuestro datatable
''Vamos a buscar los campos dentro de la coleccion del 1er DTO.
Dim CamposDeMiColeccion() As String = GetCampos(MiColeccion(1))
''Creo la funcion igual a la primera pero recorremos la coleccion.
Dim miDatatable As DataTable = GetDataTableColeccion(CamposDeMiColeccion, MiColeccion)
'Y nuestro datatable tiene los Rows que pertenecen a la coleccion de DTOs.
End Sub
Private Function GetCampos(ByVal Dto) As String()
'Array de string que devolvera los campo
Dim Str(-1) As String
For Each Prop As PropertyInfo In DirectCast(Dto, Object).GetType.GetProperties
ReDim Preserve Str(UBound(Str) + 1)
Str(UBound(Str)) = Prop.Name
Next
Return Str
End Function
Private Function GetDataTable(ByVal Campos(), ByVal DTO) As DataTable
'DTO para Datatable de 1 Sola Linea
Dim Dt As New DataTable
For i As Integer = 0 To Campos.Count - 1
Dt.Columns.Add(Campos(i))
Next
'' Ya tenemos los campos en nuestro datatable ahora lo rellenamos
Dim Dr As DataRow = Dt.NewRow
'recorro las columnas para ir rellenado los valores que tiene el DTO.
For Each Dc As DataColumn In Dt.Columns
Dr(Dc.ColumnName) = DTO.GetType.InvokeMember(Dc.ColumnName, BindingFlags.GetProperty, Nothing, DTO, Nothing)
Next
'y lo añado a el datatable
Dt.Rows.Add(Dr)
Return Dt
End Function
Private Function GetDataTableColeccion(ByVal Campos() As String, ByVal Coleccion As Collection) As DataTable
Dim Dt As New DataTable
''Campos sigue siendo igual.
For i As Integer = 0 To Campos.Count - 1
Dt.Columns.Add(Campos(i))
Next
'' recorremos la coleccion y vamos sacando los DTOs
For i As Integer = 1 To Coleccion.Count
Dim Dto = Coleccion(i)
'' Ya tenemos los campos en nuestro datatable ahora lo rellenamos
Dim Dr As DataRow = Dt.NewRow
'recorro las columnas para ir rellenado los valores que tiene el DTO.
For Each Dc As DataColumn In Dt.Columns
Dr(Dc.ColumnName) = Dto.GetType.InvokeMember(Dc.ColumnName, BindingFlags.GetProperty, Nothing, Dto, Nothing)
Next
'y lo añado a el datatable
Dt.Rows.Add(Dr)
Next
Return Dt
End Function
End Class
NOS HEMOS CAMBIADO ESTAMOS EN SOULSMAKERS.COM CON MUCHISIMOS CONTENIDOS VIDEOS Y EJEMPLOS
Un Saludo.