Переменные, накопленные с флажком - PullRequest
0 голосов
/ 24 октября 2019

У меня есть DataGridView, который показывает имя, сотовый телефон из базы данных в SQLServer и имеет флажки. Кнопка будет массово отправлять сообщения этим клиентам, поэтому я хочу, чтобы каждый флажок CheckBox сохранял переменную. Проблема в том, что сообщения в цикле for, которые я отправил, не были отправлены.

Для массовой отправки сообщений этот блок используется в строке:

string bloque = "";

bloque += bloque + "ID1\tphoneNumber\tMessage\n";//client A

bloque += bloque + "ID2\tphoneNumber\tMessage\n";//client B

Тогда я подумал, что смогу это сделатьпо-другому, выполняя цикл, который автоматически увеличивал бы идентификатор для каждого проверенного CheckBox и назначал сотовый телефон циклу, чтобы при нажатии кнопки он отправлял сообщение всем выбранным клиентам.

В настоящее время этоэто все, что у меня есть код:

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

    public void allId(){
        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>();
        string cel;
        foreach (DataGridViewRow row in dtgId.Rows){
            if (row.Cells[1].Value.Equals(true)){
                celulares.Add(row.Cells[0].Value.ToString());//columna donde estan los celulares
                cel = row.Cells[0].Value.ToString();//variable con el celular
            }
        }

        //Codigo para enviar SMS
        string usuario= "usuario";
        string clave = "clave";
        string respuesta = ""; 
        string text = txtTexto.Text;
        string bloque = "";
        //bloque += bloque + "ID1\tphoneNumber\tMessage\n"; 
I try to replace this with the for cycle
        contador++;
        for (int i = 0; i < cellphones.Count; i++){
            bloque += bloque + "ID" + Convert.ToInt32(contador) + "\t" + cellphones[i] + "\t" + text + "\n";          
        }
    }
}

1 Ответ

1 голос
/ 30 октября 2019

Неясно, что вы пытаетесь сделать, однако из того, что я могу расшифровать, когда форма загружается, кажется, вызывать несуществующий метод allID? … Я предполагаю, что вы имеете в виду allId, который заполняет сетку тремя (3) столбцами данных: id, name и cell.

Затем DataGridViewCheckBoxColumn «добавляется» в сетку. Это добавит столбец флажка в качестве «последнего» столбца в сетке, который в этом примере будет иметь индекс три (3).

Я предполагаю, что в событии нажатия кнопки, вы хотите захватитьвсе строки, в которых есть столбец флажка «флажок». Опубликованное событие button2_Click сбивает с толку, и я предполагаю, что мне не хватает чего-то, что не было объяснено.

Для начала неясно, что за cellphones переменная IS… я предполагаю, что вы имеете в виду List<string> celulares ???

В первом цикле foreach, проходящем по строкам сетки, создается впечатление, что оно добавляет первое [0] значение ячейки (ID) в список celulares, если значение в ячейке [1] (имя) равно true ???

Принимая это из опубликованного кода, может показаться, что оператор if….

if (row.Cells[1].Value.Equals(true))

БУДЕТ ВСЕГДА ОТКАЗАТЬ, так как значение ячейки в индексе один [1] является полем name и никогда не будет истинным.

Затем появляется второй цикл for, который проходит через всеэлементы в списке celulares и объединяет эти строки в одинстрока bloque. Неясно, для чего предназначены все остальные «неиспользуемые» переменные. И непонятно, зачем вам для этого нужны два (2) цикла.

Похоже, что цель здесь - заполнить строку bloque всеми идентификаторами из всех проверенных строк в сетке. Я понятия не имею, для чего нужна переменная Contador.

Для простоты. Ниже приведен пример, который просто собирает всю информацию из каждой строки, которая «проверена», и добавляет эту информацию в строку «блочных» вместе с массовым текстом. Я предполагаю, что если вы хотите отправить «одно и то же» сообщение всем клиентам, то добавление «одного и того же» сообщения для каждого клиента в список не требуется. В приведенном ниже примере будет добавлено одно и то же сообщение для каждого клиента.

private void Form1_Load(object sender, EventArgs e) {
  allID();
  DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn();
  chk.HeaderText = "Select";
  chk.Name = "check";
  dtgId.Columns.Add(chk);
  dtgId.AllowUserToAddRows = false;
}

public void allID() {
  try {
    dtgId.DataSource = GetTable();
  }
  catch (SqlException ex) {
    MessageBox.Show("Error: " + ex.Message);
  }
}

private DataTable GetTable() {
  DataTable dt = new DataTable();
  dt.Columns.Add("ID", typeof(int));
  dt.Columns.Add("Name", typeof(string));
  dt.Columns.Add("CellPhone", typeof(string));
  for (int i = 0; i < 25; i++) {
    dt.Rows.Add(i, "name_" + i, "cellPhone_" + i);
  }
  return dt;
}

private void button2_Click(object sender, EventArgs e) {
  StringBuilder bloque = new StringBuilder();
  foreach (DataGridViewRow row in dtgId.Rows) {
    if (row.Cells["check"].Value != null && row.Cells["check"].Value.Equals(true)) {
      bloque.AppendLine("ID: " + row.Cells["ID"].Value + "\t" + row.Cells["Name"].Value + "\t" + row.Cells["CellPhone"].Value + "\t" + txtTexto.Text);
    }
  }
  // unclear what you want to do with bloque...?
  textBox1.Text += bloque.ToString();
  textBox1.Text += "---------------------------------------------" + Environment.NewLine;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...