【问题标题】:Variables accumulated with checkbox用复选框累积的变量
【发布时间】:2019-10-24 12:48:04
【问题描述】:

我有一个 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";          
        }
    }
}

【问题讨论】:

  • DGV 可能无法重新粉刷。当您更改 DGV 时,您需要将其设置为 null 以重新绘制:dtgId.DataSource = null; dtgId.DataSource = ds.Tables[0];
  • 为什么将数据作为 http 请求传递,而不是直接使用 ADO.NET 将其保存到数据库中?
  • 所以,我应该添加这一行:dtgId.DataSource = null;? @jdweng​​span>
  • 是的,以确保 DGV 得到更新。

标签: c# sql-server string winforms datagridview


【解决方案1】:

目前尚不清楚您要做什么,但是,据我所知,当表单加载时,它似乎调用了一个不存在的方法allID? ... 我假设您的意思是 allId,它用三 (3) 列数据填充网格:id、name 和蜂窝​​。

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

我假设在按钮单击事件中,您想要获取所有“选中”复选框列的行。发布的 button2_Click 事件令人困惑,我猜我遗漏了一些尚未解释的内容。

对于初学者来说,不清楚cellphones 变量是什么......我假设你的意思是List&lt;string&gt; celulares???

在第一个 foreach 循环遍历网格中的行时,如果单元格 [1](名称)中的值是true???

从发布的代码中可以看出,if 声明...。

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

总是会失败,因为索引一 [1] 处的单元格值是 name 字段并且永远不会为真。

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

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

为了让事情变得简单。下面是一个示例,它简单地从“检查”的每一行中获取所有信息,并将此信息与大量文本一起添加到“bloque”字符串中。我猜如果您想向所有客户发送“相同”消息,那么将每个客户的“相同”消息放入列表中是不必要的。下面的示例将为每个客户添加相同的消息。

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

【讨论】:

  • 谢谢 :) 使用 StringBuilder 的代码 sn-p bla bla bla 我可以解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多