none
Enviar valores de Listbox Por Correo RRS feed

  • Pregunta

  • Hola Buenas a todos 

    Actualmente creo un software que muestra calculos por un listbox , ocupo esta linea de codigo para llenar el body "msg.Body = listBox1.SelectedItems.ToString();" pero como llene los campos de este por un procedimiento almacenado  en su lugar el mensaje me dice System.Windows.Forms.ListBox+SelectedObjectCollection

    Alguna idea de como puedo solucionarlo ?

    lunes, 2 de diciembre de 2019 5:21

Respuestas

  • gracias amigo por tu ayuda pero ya lo solucione , así me funciono  

    StringBuilder sb = new StringBuilder();
                     foreach (object item in listBox1.Items)
                     {
                          sb.Append(item.ToString() + ", ");
                     }
                     string resultado = sb.ToString();

    el listBox1.SelectedItems , lo reemplace por listBox1.Items


    Gmclock

    • Marcado como respuesta Gmclock10 martes, 3 de diciembre de 2019 23:43
    martes, 3 de diciembre de 2019 23:43

Todas las respuestas

  • como llene los campos de este por un procedimiento almacenado  en su lugar el mensaje me dice System.Windows.Forms.ListBox+SelectedObjectCollection

    No, no tiene nada que ver con el hecho de que lo llenases con un procedimiento almacenado. Te daría el mismo error si lo hubieses llamado de cualquier otra forma. El problema es que llamas a SelectedItems.ToString, pero SelectedItems no define un método ToString. Entonces el compilador llama al método ToString que SelectedItems hereda de Object. Y, claro, Object no sabe nada acerca de los items seleccionados, lo que hace el ToString de la clase object es escribir el nombre de la clase. Y eso es lo que estás viendo.

    Enseñanza: No llames a .ToString arbitrariamente sobre un objeto cualquiera si no sabes con seguridad que dicho objeto contiene un override de ToString que hace lo que tú quieres que haga.

    Solución: No tendrás más remedio que usar un bucle para ir convirtiendo a String por separado cada uno de los items, y luego concatenarlos todos.

    StringBuilder sb = new StringBuilder()
    foreach (object item in listBox1.SelectedItems)
    {
        sb.Append(item.ToString() + ", ");
    }
    string resultado = sb.ToString();

    También podrías usar String.Join (que por dentro ya implementa el bucle), pero escribiendo el bucle de manera expresa tienes más control sobre qué es exactamente lo que concatenas y cómo lo separas del siguiente, y podrías aplicar formatos a cada item, etc.

    lunes, 2 de diciembre de 2019 7:44
    Moderador
  • Amigo ese bucle lo pongo en donde lleno los datos del list box o en donde asigno el body del msg ?

    lunes, 2 de diciembre de 2019 15:14
  • Amigo ese bucle lo pongo en donde lleno los datos del list box o en donde asigno el body del msg ?

    Lo pones en sustitución de lo que antes hacías cuando ponías listBox1.SelectedItems.ToString()

    Obviamente no tiene absolutamente nada que ver con el sitio donde llenas el listbox. Solo se refiere al sistio donde sacas los valores para enviarlos.

    La forma en la que llenas el listbox es completamente irrelevante a estos efectos. No guarda ninguna relación con el tema del que estamos hablando. Todo esto se haría exactamente igual aunque el listbox lo hubieses cargado de cualquier otra manera distinta.

    lunes, 2 de diciembre de 2019 15:58
    Moderador
  • Pongo esto pero me envia un correo en blanco

    private void button2_Click(object sender, EventArgs e)
            {
                CNSueldo objn = new CNSueldo();
                StringBuilder sb = new StringBuilder();
                foreach (object item in listBox1.SelectedItems)
                {
                    sb.Append(item.ToString()+ ", ");
                }
                string resultado = sb.ToString(); ;

                System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
                        msg.To.Add(txt1.Text);
                        msg.Subject = "Presupuesto";
                        msg.SubjectEncoding = System.Text.Encoding.UTF8;
                        //para copias 
                        msg.Bcc.Add(UserLoginCache.Email);
                        msg.Body = resultado ;
                        msg.From = new System.Net.Mail.MailAddress(UserLoginCache.Email);

                        System.Net.Mail.SmtpClient cliente = new System.Net.Mail.SmtpClient();

                        cliente.Credentials = new System.Net.NetworkCredential("gmcoin11@gmail.com", "*********");
                        cliente.Port = 587;
                        cliente.EnableSsl = true;
                        cliente.Host = "smtp.gmail.com";
                        try
                        {
                            cliente.Send(msg);
                            MessageBox.Show("se envio correctamente");
                            try
                            {
                                txt1.Clear();
                                txt1.Visible = false;
                                listBox1.Items.Clear();
                                listBox1.Visible = false;
                                button2.Visible = false;

                             }
                            finally { }

                        }
                        catch (Exception)
                        {

                            MessageBox.Show("error al enviar");
                        }
                      }

                                




    lunes, 2 de diciembre de 2019 18:51
  • No me extraña que funcione mal. ¿Por qué diablos le has puesto [1] detrás del ToString()? ¿Qué pretendías hacer con ello, que solo se envíe el segundo carácter de cada item?

    Si después de corregir esto sigue sin funcionar, es el momento de usar el debugger. Pon un punto de ruptura antes del foreach y síguelo paso a paso, comprobando qué es lo que llega en el selecteditems, cuántas iteraciones hace el bucle, qué es lo que concatena en el Stringbuilder y qué es lo que finalmente sale en "resultado". A la vista de estos datos se puede inferir qué es lo que está sucediendo.

    lunes, 2 de diciembre de 2019 19:32
    Moderador
  • Lo Pongo como me dices pero aun me envia un correo en blanco 

    Gmclock

    lunes, 2 de diciembre de 2019 20:11
  • Bien, y ¿qué es lo que nos muestra el debugger al examinar  paso a paso todos los datos que habíamos dicho antes?
    lunes, 2 de diciembre de 2019 20:47
    Moderador
  • que necesita ver 

    


    Gmclock


    • Editado Gmclock10 lunes, 2 de diciembre de 2019 22:03
    lunes, 2 de diciembre de 2019 22:03
  • Bien, perfecto, ya sabemos que en el último de todos los pasos que habíamos mencionado, el resultado ya llega incorrecto. Ahora retrocedamos a todos los anteriores y examinémoslos uno por uno hasta ver en cuál de todos ellos es donde no llegan los valores que esperábamos que llegasen. Repito el texto del mensaje anterior:

    "Pon un punto de ruptura antes del foreach y síguelo paso a paso, comprobando qué es lo que llega en el selecteditems, cuántas iteraciones hace el bucle, qué es lo que concatena en el Stringbuilder ..."

    De todo ello, la parte más importante es la de verificar qué es lo que nos está llegando en ese punto al SelectedItems, porque si nos llegase vacío entonces obviamente todo lo que hacemos a continuación no servirá para nada y el resultado quedará vacío.

    martes, 3 de diciembre de 2019 10:41
    Moderador
  • gracias amigo por tu ayuda pero ya lo solucione , así me funciono  

    StringBuilder sb = new StringBuilder();
                     foreach (object item in listBox1.Items)
                     {
                          sb.Append(item.ToString() + ", ");
                     }
                     string resultado = sb.ToString();

    el listBox1.SelectedItems , lo reemplace por listBox1.Items


    Gmclock

    • Marcado como respuesta Gmclock10 martes, 3 de diciembre de 2019 23:43
    martes, 3 de diciembre de 2019 23:43