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