使用复选框累积的变量

时间:2019-10-24 12:48:04

标签: c# sql-server string winforms datagridview

我有一个DataGridView,它显示名称,SQLServer数据库中的手机以及具有CheckBoxes。该按钮将大量向这些客户发送消息,这就是为什么我希望选中每个CheckBox来存储变量。问题是我发送的for周期中的消息没有发送。

要批量发送消息,请在字符串中使用此块:

string bloque = "";

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

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

然后我想我可以通过执行一个循环来做不同的事情,这将为每个CheckBox自动增加ID,并将手机分配给该循环,以便当我按下按钮时,它将消息发送给所有选定的客户端

目前,这就是我所拥有的全部代码:

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 个答案:

答案 0 :(得分:1)

目前尚不清楚您要做什么,但是据我所知,加载表单时,它似乎在调用不存在的方法allID? …我假设您的意思是allId,它用三(3)列数据填充ID:名称,名称和蜂窝电话。

然后,DataGridViewCheckBoxColumn被“添加”到网格。这会将复选框列添加为网格中的“最后”列,在此示例中,该列将位于索引三(3)。

我假设在按钮单击事件中,您想抓住所有复选框都为“选中”的行。发布的button2_Click事件令人困惑,我想我正在丢失一些没有已解释。

对于初学者来说,尚不清楚cellphones变量是什么...我假设您是说List<string> celulares ???

在第一个foreach循环遍历网格中的行时,如果单元格[1]中的值似乎是将第一个[0]单元格值(ID)添加到celulares列表中(名称)为true ???

鉴于已发布的代码,看来if语句…。

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

由于索引为[1]的单元格值是name字段,因此永远都会失败。

接下来,第二个for循环似乎遍历celulares列表中的所有项目,并将这些行连接为单个字符串bloque。尚不清楚其他所有“未使用”的变量是做什么用的。目前还不清楚为什么需要两(2)个循环。

看来,这里的目标是用网格中所有选中行的所有ID填充bloque字符串。我不知道Contador变量的用途。

使事情保持简单。下面是一个示例,该示例简单地从“选中”的每一行中获取所有信息,并将此信息与大量文本一起添加到“ blood”字符串中。我猜想,如果您想向所有客户发送“相同”消息,则不需要将每个客户的“相同”消息放入列表中。下面的示例将为每个客户添加相同的消息。

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;
}