1

Tengo un DataGridView que muestra nombre, celular desde una base de datos en SQLServer y que tiene CheckBoxes. El botón enviará de manera masiva mensajes a esos clientes, por eso es que quiero que se cada CheckBox tildado almacene la variable. El problema está en que no se mandan los mensajes en el ciclo for que hice.

Para enviar mensajes de manera masiva se utiliza este bloque en string:

string bloque = "";

bloque += bloque + "ID1\tNumeroCelular\tMensaje\n";//cliente A

bloque += bloque + "ID2\tNumeroCelular\tMensaje\n";//cliente B

Entonces pensé que podría hacerlo de otra manera haciendo un ciclo, el cual aumentaría el ID de manera automática por cada CheckBox tildado y asignaría el celular al ciclo para que cuando presione el botón este envíe el mensaje a todos los clientes seleccionados.

Actualmente, esto es todo lo que tengo de código:

public partial class Form1 : Form {
    int contador = 0;
    public Form1(){
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e){
        llenarId();
        //dtgId.ReadOnly = true;
        DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn();
        chk.HeaderText = "Seleccione";
        chk.Name = "check";
        dtgId.Columns.Add(chk);
        dtgId.AllowUserToAddRows = false;
    }

    public void llenarId(){
        try{
            string cadena = "cadena";
            using (SqlConnection con = new SqlConnection(cadena)){
                con.Open();
                string query = "SELECT id, nombre, celular FROM clientes";
                SqlCommand cmd = new SqlCommand(query, con);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);
                dtgId.DataSource = ds.Tables[0];
                con.Close();
            }
        }
        catch (SqlException ex){
            MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void button2_Click(object sender, EventArgs e){
        List<string> celulares = new List<string>();
        foreach (DataGridViewRow row in dtgId.Rows){
            bool variable = (bool)row.Cells[3].Value;
            if (variable){
                celulares.Add(row.Cells[2].Value.ToString());//columna donde estan los celulares
            }
        }

        //Codigo para enviar SMS
        string usuario = "usuario";
        string clave = "clave";
        string respuesta = ""; 
        string texto = txtTexto.Text;
        string bloque = "";
        //bloque += bloque + "ID1\tNumeroCelular\tMensaje\n"; trato de reemplazar esto por el ciclo for
        contador++;
        for (int i = 0; i < celulares.Count; i++){
            bloque = bloque + "ID" + Convert.ToInt32(contador) + "\t" + celulares[i] + "\t" + texto + "\n";
            Console.WriteLine(bloque);
        }

        Uri uri = new Uri("uri");

        HttpWebRequest requestFile = (HttpWebRequest)WebRequest.Create(uri);
        requestFile.Method = "POST";
        requestFile.ContentType = "application/x-www-form-urlencoded";
        StringBuilder postData = new StringBuilder();
        postData.Append("api=" + System.Web.HttpUtility.UrlEncode("1") + "&");
        postData.Append("usuario=" + System.Web.HttpUtility.UrlEncode(usuario) + "&");
        postData.Append("clave=" + System.Web.HttpUtility.UrlEncode(clave) + "&");
        postData.Append("separadorcampos=" + System.Web.HttpUtility.UrlEncode("tab") + "&");
        postData.Append("bloque=" + System.Web.HttpUtility.UrlEncode(bloque) + "&");

        //byte[] byteArray = Encoding.GetEncoding("iso-8859-1").GetBytes(postData.ToString());
        byte[] byteArray = Encoding.UTF8.GetBytes(postData.ToString());

        requestFile.ContentLength = byteArray.Length;

        Stream requestStream = requestFile.GetRequestStream();
        requestStream.Write(byteArray, 0, byteArray.Length);
        requestStream.Close();
        HttpWebResponse webResp = requestFile.GetResponse() as HttpWebResponse;
        if (requestFile.HaveResponse){
            if (webResp.StatusCode == HttpStatusCode.OK || webResp.StatusCode == HttpStatusCode.Accepted){
                StreamReader respReader = new StreamReader(webResp.GetResponseStream(), Encoding.GetEncoding("iso-8859-1"));
                respuesta = respReader.ReadToEnd();
                MessageBox.Show(respuesta);
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {//agregué este botón sin el ciclo para mostrarles que de este modo si funciona
        //Codigo para enviar SMS
        string usuario = "usuario";
        string clave = "clave";
        string bloque = "";
        string respuesta = ""; //en esta variable quedará la respuesta del llamado a la API de SMS MASIVOS

        bloque = bloque + "ID1\t1111111111\tPrueba \n";
        bloque = bloque + "ID2\t2222222222\tPrueba \n";

        Uri uri = new Uri("uri");

        HttpWebRequest requestFile = (HttpWebRequest)WebRequest.Create(uri);

        requestFile.Method = "POST";
        requestFile.ContentType = "application/x-www-form-urlencoded";

        StringBuilder postData = new StringBuilder();
        postData.Append("api=" + System.Web.HttpUtility.UrlEncode("1") + "&");
        postData.Append("usuario=" + System.Web.HttpUtility.UrlEncode(usuario) + "&");
        postData.Append("clave=" + System.Web.HttpUtility.UrlEncode(clave) + "&");
        postData.Append("separadorcampos=" + System.Web.HttpUtility.UrlEncode("tab") + "&");
        postData.Append("bloque=" + System.Web.HttpUtility.UrlEncode(bloque) + "&");
        byte[] byteArray = Encoding.UTF8.GetBytes(postData.ToString());

        requestFile.ContentLength = byteArray.Length;

        Stream requestStream = requestFile.GetRequestStream();
        requestStream.Write(byteArray, 0, byteArray.Length);
        requestStream.Close();

        HttpWebResponse webResp = requestFile.GetResponse() as HttpWebResponse;

        if (requestFile.HaveResponse)
        {
            if (webResp.StatusCode == HttpStatusCode.OK || webResp.StatusCode == HttpStatusCode.Accepted)
            {
                StreamReader respReader = new StreamReader(webResp.GetResponseStream(), Encoding.GetEncoding("iso-8859-1"));

                respuesta = respReader.ReadToEnd();
                MessageBox.Show(respuesta);
            }
        }
    }
}
gbianchi
  • 19,675
  • 11
  • 38
  • 58
Franqo Balsamo
  • 937
  • 1
  • 11
  • 34
  • 1
    Cual seria exactamente el problema? porque estas guardando los celulares en una lista... – gbianchi Oct 23 '19 at 13:41
  • Lo que sucede es que aunque los guarde en una lista, no consigo que se envíen varios mensajes al presionar el botón. @gbianchi – Franqo Balsamo Oct 23 '19 at 13:46
  • 1
    Al presionar que boton? donde esta ese codigo que falla? tomate unos segundos, y escribe la pregunta como para que entendamos tu problema.. asi como esta, es una maraña de codigo y no se entiende que esta pasando y donde... – gbianchi Oct 23 '19 at 13:49
  • Ya lo he modificado @gbianchi – Franqo Balsamo Oct 23 '19 at 14:18
  • 1
    Tu codigo esta tirando un error no? – gbianchi Oct 23 '19 at 14:22
  • No, no me está mostrando ningún error @gbianchi – Franqo Balsamo Oct 23 '19 at 14:24
  • 1
    Y entonces cuando dices que no funciona, que es lo que no funciona? – gbianchi Oct 23 '19 at 14:25
  • Al hecho de que no llegan los mensajes luego de presionar el botón. A eso me refiero con el "no funciona". Si yo utilizo esto: ```bloque += bloque + "ID1\tNumeroCelular\tMensaje\n";``` añadiendo varios de esos bloques con distinto ID y celular los mensaje se envían y me llegan. Pero, al usar el ciclo no envía ni me llegan los mensajes – Franqo Balsamo Oct 23 '19 at 14:28
  • 1
    Y el string se arma correctamente? o sea el problema es armar el string o enviar los mensajes? – gbianchi Oct 23 '19 at 14:32
  • Sí, el string funciona de manera correcta porque probé añadiendo un TextBox haciendo que al seleccionar un cliente, se escriba el celular en el TextBox y al presionar el botón me llegó el mensaje. El problema es que eso solo funciona con un cliente. Por ende, el problema está en enviar varios mensajes a la vez @gbianchi – Franqo Balsamo Oct 23 '19 at 14:35
  • 1
    @FranqoBalsamo en el For solo lo estas recorriendo, pero no le estas pasando la posicion del recorrido, por ejemplo celulares[i] – Manny Oct 23 '19 at 14:53
  • Ya, lo acabo de añadir y aún no funciona @Manny – Franqo Balsamo Oct 23 '19 at 14:55

2 Answers2

3

Tu problema no es lo que decis.

Tu problema es que el string que estas armando esta mal.

No es un problema al enviar mensajes.

Fijate este codigo:

List<string> celulares = new List<string>();
....
for (int i = 0; i < celulares.Count; i++)
{
    bloque += bloque + "ID" + Convert.ToInt32(contador) + "\t" + celulares + "\t" + texto + "\n";//no funciona
}

Si celulares es una lista, que esperas que ponga al concatenar la lista celulares en ese string? pues, pone cualquier cosa, y tu string esta mal formado (por eso te pregunte si tu string estaba bien, y si lo miras, no, no esta bien)...

Lo que necesitas es agregarle cual fila de celulares queres...

Y para eso, como es una lista, y la misma se puede manejar como si fuera un array, alcanza con hacer

celulares[i]

Entonces, tu linea deberia ser:

bloque += bloque + "ID" + Convert.ToInt32(contador) + "\t" + celulares[i] + "\t" + texto + "\n"

Edición

Acabo de detectar otro error.. estas sumando bloque dos veces por cada vuelta! la linea deberia ser

bloque += "ID" + Convert.ToInt32(contador) + "\t" + celulares[i] + "\t" + texto + "\n"
gbianchi
  • 19,675
  • 11
  • 38
  • 58
  • Lo acabo de añadir, y no la verdad sigue sin mandar los mensajes. – Franqo Balsamo Oct 23 '19 at 14:57
  • 1
    Pero miraste que el string este bien? y donde en todo tu codigo se mandan los mensajes? – gbianchi Oct 23 '19 at 15:03
  • 1
    Y si escribis a mano funciona? Me parece que mareaste totalmente tu problema... @FranqoBalsamo. Para dos numeros pasados a mano podes? – gbianchi Oct 23 '19 at 15:05
  • Sí, para dos números pasados a mano si funciona. Veamos: ```bloque += bloque + "ID1\t11111111\tMensaje\n";//cliente A``` ```bloque += bloque + "ID2\t2222222\tMensaje\n";//cliente B``` Si yo escribo eso así, manualmente en el código del botón , sí funciona – Franqo Balsamo Oct 23 '19 at 15:07
  • Vale, edité el código original para que veas que con string cargado de manera manual dentro de un botón funciona. – Franqo Balsamo Oct 23 '19 at 15:14
  • 1
    Perfecto, y ahora nos muestras que queda en bloque una vez que pasa el for? para ver si lo esta armando bien, que es lo que te pregunte varias veces ya... @FranqoBalsamo – gbianchi Oct 23 '19 at 15:33
  • 1
    @FranqoBalsamo fijate que tenias otro error al armar el string.. sumabas dos veces el string anterior – gbianchi Oct 23 '19 at 15:35
  • Primero, no entiendo bien tu pregunta sobre que queda en bloque una vez que pasa el for? Ese es todo el código del aplicativo. Y en cuánto al error del string lo puse así porque el código original del bloque es: ```bloque=bloque+etcétera``` – Franqo Balsamo Oct 23 '19 at 15:39
  • 1
    @FranqoBalsamo que queda dentro del string bloque. depura tu programa y fijate si queda un string que sea valido... – gbianchi Oct 23 '19 at 15:46
  • Pues depuro y me sale: `null` – Franqo Balsamo Oct 24 '19 at 12:15
  • 1
    Y en que momento le asignas null a bloque? si "" no es lo mismo que null y asi es como se inicia? @FranqoBalsamo – gbianchi Oct 24 '19 at 13:44
  • Bien, ya he modificado el código y ahora funciona de manera correcta. No puedo poner `bloque="ID"+etcétera` porque sino no envía los mensajes. Por lo que debo dejarlo como `bloque = bloque +"Id"+etcétera`. Ahora, esto funciona si selecciono todos los checkbox si no selecciono ninguno o si selecciono algunos sale este error: `System.NullReferenceException: 'Referencia a objeto no establecida como instancia de un objeto.' System.Windows.Forms.DataGridViewCell.Value.get devolvió null.` – Franqo Balsamo Oct 24 '19 at 14:44
  • 1
    Eso es otra pregunta distinta. Si modificas asi la pregunta, la respuesta ya no tiene sentido. lo que vos estas haciendo con bloque = no es lo que puse yo en mi respuesta, ni lo que tenias en tu codigo. Revisa bien mi edicion, = no es lo mismo que +=. Volve tu pregunta a como estaba, y eso que vos ves esta en el sitio ya contestado, asi que no vale como pregunta. mira https://es.stackoverflow.com/questions/75999/qu%c3%a9-es-una-nullreferenceexception-y-c%c3%b3mo-solucionarla @FranqoBalsamo – gbianchi Oct 24 '19 at 15:04
-2

Lo que debes hacer es añadir un escucha de evento a los las cajas de chequeo tal que al cambiar de estado puedas eliminar o añadir a la lista donde guardas los números seleccionados para enviar el mensaje

  • 2
    Estimado, eso es mas un comentario que una respuesta, para responder por favor lee [cómo responder](https://es.stackoverflow.com/help/how-to-answer) para que tu respuesta sea bien aceptada. Saludos! – harifo Oct 23 '19 at 13:45