elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Enviar DataGridView por Email VB.net 2010
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Enviar DataGridView por Email VB.net 2010  (Leído 6,054 veces)
el_cantante

Desconectado Desconectado

Mensajes: 80



Ver Perfil
Enviar DataGridView por Email VB.net 2010
« en: 18 Septiembre 2015, 15:37 pm »

Hola,
Estoy intentando enviar un DataGridView por Email.
Mi problema es que el email que  recibo repite por cada renglón del datagridview todo el mensaje. Y obviamente lo que yo busco hacer es que envie la tabla completa.
Me explico mejor con un ejemplo, lo que recibo es lo siguiente:

Buenos dias

nombre      apellido   
Juan          Perez

Saludos

Buenos dias

nombre      apellido   
Roberto      Diaz

Saludos


Y lo que yo quiero recibir es esto:


Buenos dias

nombre      apellido
Juan          Perez   
Roberto      Diaz

Saludos


Este es el codigo que exporta el datagridview y envia el email, por favor alguien me podria decir donde me equivoco?

Código:
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
        Dim html As String = String.Empty
        Dim Mail As New MailMessage

        Mail.Subject = My.Settings.oggetto
        Mail.To.Add(My.Settings.destinatario)
        Mail.From = New MailAddress(My.Settings.mittente)
        Mail.IsBodyHtml = True
        Dim tipo, nome, tipo_appuntamento, scadenza, note As String
        Dim strMailBody As String
        Dim i As Integer

        For i = 0 To DataGridView1.Rows.Count - 1

            tipo = DataGridView1.Item(0, i).Value.ToString
            nome = DataGridView1.Item(1, i).Value.ToString
            tipo_appuntamento = DataGridView1.Item(2, i).Value.ToString
            scadenza = DataGridView1.Item(3, i).Value.ToString
            note = DataGridView1.Item(4, i).Value.ToString

            html = html & "<HTML>"
            html = html & "<HEAD>"
            html = html & "<TITLE>Avvisi Sicurezza</TITLE>"
            html = html & "</HEAD>"
            html = html & "<BODY  bgcolor=""lightyellow"">"
            html = html & " " & Now() & " <BR> <BR> "
            html = html & "<B>Buongiorno, " & DataGridView1.Rows.Count & " <BR> "
            html = html & "Queste sono le scadenze per i prossimi " & My.Settings.allert & " giorno/i " & " <BR><BR> </B>"
            html = html & "<TABLE cellpadding=""1""  COLS=""1"" SIZE=""1"" border=""1"" BORDERCOLOR= ""black"">"
            html = html & "<TR><TH>"
            html = html & tipo & " </TH>"
            html = html & "<TH>"
            html = html & nome & "</TH>"
            html = html & "<TH>"
            html = html & tipo_appuntamento & " </TH>"
            html = html & "<TH>"
            html = html & scadenza & "</TH>"
            html = html & "<TH>"
            html = html & note & "</TH>"
            html = html & "</TR>"
            html = html & "</FONT></TABLE><BR>"
            html = html & "</BODY>"
            html = html & "</HTML>"

           
        Next

        Mail.Body = html

        Dim SMTP As New SmtpClient(My.Settings.server_email)
        SMTP.EnableSsl = True
        SMTP.Credentials = New    System.Net.NetworkCredential(My.Settings.utente_email, My.Settings.password_email)
        SMTP.Port = My.Settings.porta_email
        SMTP.Send(Mail)
        MsgBox("Email inviata!")
    End Sub

Gracias!

Saludos!  :)


En línea

El sistema del zapping mental en su apogeo, donde las horas pasan con la velocidad de la vida. No es el mismo domingo del principio, es un domingo anterior, otra temporada en el infierno, siete di­as atras.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Enviar DataGridView por Email VB.net 2010
« Respuesta #1 en: 18 Septiembre 2015, 21:16 pm »

Saca del bucle el <html>, el <head> y <body>. Saca TODO lo que no sea un <tr> y sus <td>/<th>.
En el bucle solo debe haber los datos que se repitan en cada registro.


En línea

eLank0
eLhAcKeR r00Lz


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Enviar DataGridView por Email VB.net 2010
« Respuesta #2 en: 19 Septiembre 2015, 01:33 am »

Áñadiendo a lo que dice el compañero ivancea96, estás repitiendo páginas HTML enteras dentro de tu código.

Salu2
En línea

el_cantante

Desconectado Desconectado

Mensajes: 80



Ver Perfil
Re: Enviar DataGridView por Email VB.net 2010
« Respuesta #3 en: 21 Septiembre 2015, 10:49 am »

Gracias a sus consejos pude resolver el problema.
El código quedo así:

Código
  1. Dim html As String = String.Empty
  2.        Dim html2 As String = String.Empty
  3.        Dim html3 As String = String.Empty
  4.        Dim Mail As New MailMessage
  5.  
  6.        Mail.Subject = My.Settings.oggetto
  7.        Mail.To.Add(My.Settings.destinatario)
  8.        Mail.From = New MailAddress(My.Settings.mittente)
  9.        Mail.IsBodyHtml = True
  10.        Dim tipo, nome, tipo_appuntamento, scadenza, note As String
  11.        Dim strMailBody As String
  12.        Dim i As Integer
  13.  
  14.        html = html & "<B>Buongiorno, " & " <BR> "
  15.        html = html & "Queste sono le scadenze per i prossimi " & My.Settings.allert & " giorno/i " & " <BR><BR> </B>"
  16.        html = html & "<TABLE cellpadding=""1""  COLS=""1"" SIZE=""1"" border=""1"" BORDERCOLOR= ""black"">"
  17.        html3 = html3 & "</FONT></TABLE><BR><BR>"
  18.        html3 = html3 & "Cordiali saluti"
  19.  
  20.  
  21.        For i = 0 To DataGridView1.Rows.Count - 1
  22.  
  23.            tipo = DataGridView1.Item(0, i).Value.ToString
  24.            nome = DataGridView1.Item(1, i).Value.ToString
  25.            tipo_appuntamento = DataGridView1.Item(2, i).Value.ToString
  26.            scadenza = DataGridView1.Item(3, i).Value.ToString
  27.            note = DataGridView1.Item(4, i).Value.ToString
  28.  
  29.  
  30.            html2 = html2 & "<TR><TH>"
  31.            html2 = html2 & tipo & " </TH>"
  32.            html2 = html2 & "<TH>"
  33.            html2 = html2 & nome & "</TH>"
  34.            html2 = html2 & "<TH>"
  35.            html2 = html2 & tipo_appuntamento & " </TH>"
  36.            html2 = html2 & "<TH>"
  37.            html2 = html2 & scadenza & "</TH>"
  38.            html2 = html2 & "<TH>"
  39.            html2 = html2 & note & "</TH>"
  40.            html2 = html2 & "</TR>"
  41.  
  42.  
  43.        Next
  44.        strMailBody += html & html2 & html3 & vbCrLf
  45.        Mail.Body = strMailBody
  46.  
  47.        Dim SMTP As New SmtpClient(My.Settings.server_email)
  48.        SMTP.EnableSsl = True
  49.        SMTP.Credentials = New System.Net.NetworkCredential(My.Settings.utente_email, My.Settings.password_email)
  50.        SMTP.Port = My.Settings.porta_email
  51.        SMTP.Send(Mail)
  52.        MsgBox("Email inviata!")
  53.  

Muchas gracias!!  ;-)

Saludos!  :)
« Última modificación: 21 Septiembre 2015, 12:52 pm por Eleкtro » En línea

El sistema del zapping mental en su apogeo, donde las horas pasan con la velocidad de la vida. No es el mismo domingo del principio, es un domingo anterior, otra temporada en el infierno, siete di­as atras.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Enviar DataGridView por Email VB.net 2010
« Respuesta #4 en: 21 Septiembre 2015, 12:38 pm »

Gracias a sus consejos pude resolver el problema.
El código quedo así:

Aunque es satisfactorio resolver un problema, lo cierto es que el código del algoritmo te ha quedado muy feo debido a que estás siguiendo muy, muy malos hábitos de programación, en general le estás dando mil vueltas a un algoritmo sencillo para llevar a cabo una tarea que debería representarse de manera simple.

Lo más destacable negativamente hablando respecto al rendimiento del código que has mostrado, son las múltiples re-asignaciones de variables, puedes utilizar el operador de concatenación (&=) pero seguiría sin ser óptimo para estas circunstancias.

Te sugiero que definas una nueva class/type que usarás cómo una especie de "container" del texto html, en esa class es donde desarrollarás el algoritmo y encapsularias los datos que hagan falta, no me mezcles toda la lógica con la class del Form cómo has hecho, separa los datos.

Te muestro un ejemplo funcional, con los cambios más importantes resaltados:

Código
  1. Public NotInheritable Class GridToHtmlTableExporter
  2.  
  3.    Private ReadOnly htmlFormat As String =
  4. <a><![CDATA[
  5. <B>Buongiorno, <BR> Queste sono le scadenze per i prossimi {0} giorno/i <BR><BR> </B>
  6.  
  7. <TABLE cellpadding="1" COLS="1" SIZE="1" border="1" BORDERCOLOR= "black">
  8. {1}
  9. </TABLE>
  10.  
  11. <BR><BR> Cordiali saluti.
  12. ]]></a>.Value
  13.  
  14.    Public ReadOnly Property Allert As String
  15.        Get
  16.            Return Me.allertB
  17.        End Get
  18.    End Property
  19.    Private ReadOnly allertB As String
  20.  
  21.    Public ReadOnly Property DataGridView As DataGridView
  22.        Get
  23.            Return Me.dgvB
  24.        End Get
  25.    End Property
  26.    Private ReadOnly dgvB As DataGridView
  27.  
  28.    Public ReadOnly Property Document As String
  29.        Get
  30.            Return Me.documentB
  31.        End Get
  32.    End Property
  33.    Private ReadOnly documentB As String
  34.  
  35.    <DebuggerStepThrough>
  36.    <DebuggerHidden>
  37.    Public Sub New(ByVal allert As String,
  38.                   ByVal dgv As DataGridView)
  39.  
  40.        Me.dgvB = dgv
  41.        Me.allertB = allert
  42.        Me.documentB = String.Format(Me.htmlFormat, allert, Me.ParseGridElements(dgv))
  43.  
  44.    End Sub
  45.  
  46.    Public Overrides Function ToString() As String
  47.        Return Me.documentB
  48.    End Function
  49.  
  50.    Private Function ParseGridElements(ByVal dgv As DataGridView) As String
  51.  
  52.        Dim sb As New StringBuilder
  53.  
  54.        For rowIndex As Integer = 0 To (dgv.RowCount - 1)
  55.  
  56.            If Not (rowIndex = dgv.NewRowIndex) Then
  57.  
  58.                sb.Append("<TR>")
  59.                sb.AppendLine()
  60.  
  61.                For colIndex As Integer = 0 To (dgv.ColumnCount - 1)
  62.                    sb.AppendFormat("<TH> {0} </TH>", dgv.Item(colIndex, rowIndex).Value.ToString)
  63.                    sb.AppendLine()
  64.                Next colIndex
  65.  
  66.                sb.Append("</TR>")
  67.                sb.AppendLine()
  68.  
  69.            End If
  70.  
  71.        Next rowIndex
  72.  
  73.        Return sb.ToString
  74.  
  75.    End Function
  76.  
  77. End Class


Lo usarías de la siguiente manera:
Código
  1. Public NotInheritable Class Form1 : Inherits Form
  2.  
  3.    Private Sub Form1_Load() Handles MyBase.Shown
  4.  
  5.        ' Construyo las filas de un Grid con 5 columnas.
  6.        With Me.DataGridView1
  7.            .Rows.Add({"Row1-Value1", "Row1-Value2", "Row1-Value3", "Row1-Value4", "Row1-Value5"})
  8.            .Rows.Add({"Row2-Value1", "Row2-Value2", "Row2-Value3", "Row2-Value4", "Row2-Value5"})
  9.        End With
  10.  
  11.    End Sub
  12.  
  13.    Private Sub Button1_Click() Handles Button1.Click
  14.  
  15.        Dim htmlExporter As New GridToHtmlTableExporter("allert", Me.DataGridView1)
  16.  
  17.        ' La propiedad Document contiene el texto final del documento html.
  18.        Console.WriteLine(htmlExporter.Document)
  19.  
  20.    End Sub
  21.  
  22. End Class

Resultado de ejecución:
Citar
<B>Buongiorno, <BR> Queste sono le scadenze per i prossimi allert giorno/i <BR><BR> </B>

<TABLE cellpadding="1" COLS="1" SIZE="1" border="1" BORDERCOLOR= "black">
<TR>
<TH> Row1-Value1 </TH>
<TH> Row1-Value2 </TH>
<TH> Row1-Value3 </TH>
<TH> Row1-Value4 </TH>
<TH> Row1-Value5 </TH>
</TR>
<TR>
<TH> Row2-Value1 </TH>
<TH> Row2-Value2 </TH>
<TH> Row2-Value3 </TH>
<TH> Row2-Value4 </TH>
<TH> Row2-Value5 </TH>
</TR>
</TABLE>

<BR><BR> Cordiali saluti.

Espero que te sirva de algo el ejemplo :)

Saludos!
« Última modificación: 21 Septiembre 2015, 16:15 pm por Eleкtro » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Enviar DataGridView por Email VB.net 2010
« Respuesta #5 en: 21 Septiembre 2015, 15:19 pm »

Vaya Elektro, le estás diciendo cómo construir una casa, empezando por cómo encontrar los materiales en las minas jaja
En línea

el_cantante

Desconectado Desconectado

Mensajes: 80



Ver Perfil
Re: Enviar DataGridView por Email VB.net 2010
« Respuesta #6 en: 23 Septiembre 2015, 09:43 am »

Muchísimas gracias Eleкtro! No me esperaba una explicación tan detallada  :)
Voy a modificar el código siguiendo tu ejemplo.

Saludos! y nuevamente gracias!  :)
En línea

El sistema del zapping mental en su apogeo, donde las horas pasan con la velocidad de la vida. No es el mismo domingo del principio, es un domingo anterior, otra temporada en el infierno, siete di­as atras.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
enviar email « 1 2 »
PHP
BriaNUR 10 8,970 Último mensaje 8 Julio 2007, 05:43 am
por дٳŦ٭
enviar un datagridview por email c#[SOLUCIONADO]
.NET (C#, VB.NET, ASP)
evicar 4 11,176 Último mensaje 7 Enero 2011, 22:26 pm
por evicar
Enviar Log al Email
Análisis y Diseño de Malware
misterioy 1 2,892 Último mensaje 2 Octubre 2011, 02:03 am
por skapunky
Enviar email
Scripting
lochapa 5 3,706 Último mensaje 8 Diciembre 2013, 23:02 pm
por Eleкtro
VB.NET 2010 Download de archivos binarios en DataGridView desde MySQL
.NET (C#, VB.NET, ASP)
el_cantante 3 3,167 Último mensaje 18 Septiembre 2015, 15:23 pm
por el_cantante
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines