none
Operaciones por lotes en datagridview vb.net RRS feed

  • Pregunta

  • Buenas, estoy atascado intentado realizar una función con un datagridview en vb.net.

    El datagridview tiene tres columnas, no esta enlazado a ninguna base de datos, los datos se cargan manualmente, con tres textbox

    Bien hasta aquí, todo bien, el problema o mas bien duda seria, como ejecutar una acción y esta acción usara todos las lineas del datagridview.

    ejemplo:

    Columna 1: Correo electrónico

    Columna 2: Asunto

    Columna 3 : Mensaje

    Boton: Acción de enviar los correos recorriendo los datos de todas las filas.

    ¿Seria mas adecuado usar un listview que un datagridview?

    Gracias.

    martes, 6 de febrero de 2018 12:15

Respuestas

  • Public Class Entidad_x Private receptor As String Public Property _correo() As String Get Return receptor End Get Set(ByVal value As String) receptor = value End Set End Property Private asunto As String Public Property _asunto() As String Get Return asunto End Get Set(ByVal value As String) asunto = value End Set End Property Private mensaje As String Public Property _mensaje() As String Get Return mensaje End Get Set(ByVal value As String) mensaje = value End Set End Property End Class

    Public Class Logica_x
        Private dane As New Datos_x
    
        Public Function EnviarCorreos(ByVal Lista As List(Of Entidad_x)) As String
            Return dane.EnviarCorreos(Lista)
        End Function
    
    End Class
    Public Class Datos_x
        Public Function EnviarCorreos(ByVal lst As List(Of Entidad_x)) As String
    
            Dim msj As String = ""
            Dim Data_a_Enviar As Integer = lst.Count
            Dim Data_Enviada As Integer = 0
       
            Try
               
                For Each v As Entidad_x In lst
                    Try
                        If EnviarCorreo(v._correo, v._mensaje, v._asunto) Then
                            Data_Enviada += 1
                        End If
                    Catch ex As Exception
                        'RECOMIENDO HACER UN LOG Y COMENTAR ESTE TRY PARA QUE EL PROCESO SEA MAS FLUIDO
                        MsgBox(ex.ToString)
                        Continue For
                    End Try
    
                Next
    
            Catch ex As Exception
                'ENVIAR ERRORES POR BLOQUE
            End Try
    
            msj = "Correos a Enviar: " & Data_a_Enviar & " Enviados: " & Data_Enviada
    
            Return msj
    
        End Function
    
    
    
    
        Private Function EnviarCorreo(ByVal receptor As String, ByVal mensaje As String, ByVal asunto As String) As Boolean
    
    
    
            ' Dim adjunto As System.Net.Mail.Attachment = Nothing 'SI DESEAS USAR ADJUNTO
    
    
            Try
    
    
    
                Dim correo_origenx = "cuentagmail@gmail.com"
                Dim correo_emisorx = "EMPRESA X"
                Dim correo As New System.Net.Mail.MailMessage()
                correo.From = New System.Net.Mail.MailAddress(correo_origenx, correo_emisorx, System.Text.Encoding.UTF8)
    
                'adjunto = New System.Net.Mail.Attachment(ruta_pdf)  'SI DESEAS USAR ADJUNTO
                'correo.Attachments.Add(adjunto) 'SI DESEAS USAR ADJUNTO
    
                correo.To.Add(receptor) 'RECEPTOR O DESTINATARIO
                'correo.CC.Add("correo_copia@gmail.com")'COPIA
                'correo.Bcc.Add("correo_copia_oculta@gmail.com")'COPIA OCULTA
    
    
                correo.Subject = asunto 'Asunto
                correo.SubjectEncoding = System.Text.Encoding.UTF8
    
    
    
                correo.Body = mensaje
                correo.BodyEncoding = System.Text.Encoding.UTF8
                ' correo.IsBodyHtml = True 'EN CASO DE USAR HTML PARA DISEÑO Y COLORES EN MENSAJE
                correo.Priority = System.Net.Mail.MailPriority.Normal ' EXISTE LOW Y HIGH
    
    
                Dim smtp As New System.Net.Mail.SmtpClient
                smtp.UseDefaultCredentials = False
                smtp.Host = "smtp.gmail.com"
                smtp.Port = 25
                smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
                smtp.Credentials = New System.Net.NetworkCredential("cuentagmail@gmail.com", "CONTRASEÑA")
                smtp.EnableSsl = True
                smtp.Timeout = 20000
    
                Try
                    smtp.Send(correo) : Return True
                Catch ex1 As System.Net.Mail.SmtpException
                    Return False
                End Try
    
            Catch ex As Exception
                'RECOMIENDO HACER UN LOG Y COMENTAR ESTE TRY PARA QUE EL PROCESO SEA MAS FLUIDO
                MsgBox(ex.Message, MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Aviso")
            Finally
                ' adjunto.Dispose()EN CASO DE MANEJAR ADJUNTOS
            End Try
        End Function
    End Class
    
    Public Class frm_EnvioCorreo
        Private capa_logica As New Logica_x
        Private ListaCorreosaEnviar As List(Of Entidad_x)
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            ListaCorreosaEnviar = New List(Of Entidad_x)
    
            For Each x As DataRow In DataGridView1.Rows
                Try
                    Dim obj As New Entidad_x()
                    With obj
                        ._correo = x.Item(0).ToString 'columna1 PODRIAS USAR UNA FUNCION PARA VALIDAR EL CORREO SI EN CASO SALGA MAL LO CONTROLAS POR EL TRY
                        ._asunto = x.Item(1).ToString 'columna2
                        ._mensaje = x.Item(2).ToString 'columna3
                        ListaCorreosaEnviar.Add(obj)
                    End With
                Catch ex As Exception
                    MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    Continue For
                End Try
            Next
            Dim result = capa_logica.EnviarCorreos(ListaCorreosaEnviar)
            MsgBox(result)
        End Sub
    End Class

    Estaba sin hacer nada espero que te sirva.


    Si necesitas ayuda sube tu avance de otro modo no puedo ayudarte , Suerte!

    martes, 6 de febrero de 2018 15:53

Todas las respuestas

  • No lo unico que tienes que hacer es un reccorido a tu datagridview mediante un for o un foreach

    Dentro del  recorrido si estas trabajando en capas hacer un bucle donde agreges los objetos ala lista<Entidad>.

    En caso contrario podrias hacer que por cada recorrido se envie el mensaje llamando a tu funcion o sub.

    En caso que tengas una entidad al terminar el foreach tendrias que llamar solo 1 vez a tu proceso "EnviarCorreo"

    donde dentro de este recorras la lista y enviees los mensajes.


    Si necesitas ayuda sube tu avance de otro modo no puedo ayudarte , Suerte!

    martes, 6 de febrero de 2018 14:57
  • Public Class Entidad_x Private receptor As String Public Property _correo() As String Get Return receptor End Get Set(ByVal value As String) receptor = value End Set End Property Private asunto As String Public Property _asunto() As String Get Return asunto End Get Set(ByVal value As String) asunto = value End Set End Property Private mensaje As String Public Property _mensaje() As String Get Return mensaje End Get Set(ByVal value As String) mensaje = value End Set End Property End Class

    Public Class Logica_x
        Private dane As New Datos_x
    
        Public Function EnviarCorreos(ByVal Lista As List(Of Entidad_x)) As String
            Return dane.EnviarCorreos(Lista)
        End Function
    
    End Class
    Public Class Datos_x
        Public Function EnviarCorreos(ByVal lst As List(Of Entidad_x)) As String
    
            Dim msj As String = ""
            Dim Data_a_Enviar As Integer = lst.Count
            Dim Data_Enviada As Integer = 0
       
            Try
               
                For Each v As Entidad_x In lst
                    Try
                        If EnviarCorreo(v._correo, v._mensaje, v._asunto) Then
                            Data_Enviada += 1
                        End If
                    Catch ex As Exception
                        'RECOMIENDO HACER UN LOG Y COMENTAR ESTE TRY PARA QUE EL PROCESO SEA MAS FLUIDO
                        MsgBox(ex.ToString)
                        Continue For
                    End Try
    
                Next
    
            Catch ex As Exception
                'ENVIAR ERRORES POR BLOQUE
            End Try
    
            msj = "Correos a Enviar: " & Data_a_Enviar & " Enviados: " & Data_Enviada
    
            Return msj
    
        End Function
    
    
    
    
        Private Function EnviarCorreo(ByVal receptor As String, ByVal mensaje As String, ByVal asunto As String) As Boolean
    
    
    
            ' Dim adjunto As System.Net.Mail.Attachment = Nothing 'SI DESEAS USAR ADJUNTO
    
    
            Try
    
    
    
                Dim correo_origenx = "cuentagmail@gmail.com"
                Dim correo_emisorx = "EMPRESA X"
                Dim correo As New System.Net.Mail.MailMessage()
                correo.From = New System.Net.Mail.MailAddress(correo_origenx, correo_emisorx, System.Text.Encoding.UTF8)
    
                'adjunto = New System.Net.Mail.Attachment(ruta_pdf)  'SI DESEAS USAR ADJUNTO
                'correo.Attachments.Add(adjunto) 'SI DESEAS USAR ADJUNTO
    
                correo.To.Add(receptor) 'RECEPTOR O DESTINATARIO
                'correo.CC.Add("correo_copia@gmail.com")'COPIA
                'correo.Bcc.Add("correo_copia_oculta@gmail.com")'COPIA OCULTA
    
    
                correo.Subject = asunto 'Asunto
                correo.SubjectEncoding = System.Text.Encoding.UTF8
    
    
    
                correo.Body = mensaje
                correo.BodyEncoding = System.Text.Encoding.UTF8
                ' correo.IsBodyHtml = True 'EN CASO DE USAR HTML PARA DISEÑO Y COLORES EN MENSAJE
                correo.Priority = System.Net.Mail.MailPriority.Normal ' EXISTE LOW Y HIGH
    
    
                Dim smtp As New System.Net.Mail.SmtpClient
                smtp.UseDefaultCredentials = False
                smtp.Host = "smtp.gmail.com"
                smtp.Port = 25
                smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
                smtp.Credentials = New System.Net.NetworkCredential("cuentagmail@gmail.com", "CONTRASEÑA")
                smtp.EnableSsl = True
                smtp.Timeout = 20000
    
                Try
                    smtp.Send(correo) : Return True
                Catch ex1 As System.Net.Mail.SmtpException
                    Return False
                End Try
    
            Catch ex As Exception
                'RECOMIENDO HACER UN LOG Y COMENTAR ESTE TRY PARA QUE EL PROCESO SEA MAS FLUIDO
                MsgBox(ex.Message, MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Aviso")
            Finally
                ' adjunto.Dispose()EN CASO DE MANEJAR ADJUNTOS
            End Try
        End Function
    End Class
    
    Public Class frm_EnvioCorreo
        Private capa_logica As New Logica_x
        Private ListaCorreosaEnviar As List(Of Entidad_x)
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            ListaCorreosaEnviar = New List(Of Entidad_x)
    
            For Each x As DataRow In DataGridView1.Rows
                Try
                    Dim obj As New Entidad_x()
                    With obj
                        ._correo = x.Item(0).ToString 'columna1 PODRIAS USAR UNA FUNCION PARA VALIDAR EL CORREO SI EN CASO SALGA MAL LO CONTROLAS POR EL TRY
                        ._asunto = x.Item(1).ToString 'columna2
                        ._mensaje = x.Item(2).ToString 'columna3
                        ListaCorreosaEnviar.Add(obj)
                    End With
                Catch ex As Exception
                    MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    Continue For
                End Try
            Next
            Dim result = capa_logica.EnviarCorreos(ListaCorreosaEnviar)
            MsgBox(result)
        End Sub
    End Class

    Estaba sin hacer nada espero que te sirva.


    Si necesitas ayuda sube tu avance de otro modo no puedo ayudarte , Suerte!

    martes, 6 de febrero de 2018 15:53
  • Aveces cuando usas una cuenta de gmail.com o hotmail.com para que no te tome como span o aplicacion no segura tienes que configurar tu cuenta :

    En caso de gmail aqui Link


    Si necesitas ayuda sube tu avance de otro modo no puedo ayudarte , Suerte!

    martes, 6 de febrero de 2018 16:07
  • Gracias por la respuesta, voy a probar y te comento :)
    martes, 6 de febrero de 2018 17:11