现做一个东西,就是在dataGridView里批量修改用户选中的行在数据库中得值,三千多条数据要十几分钟,为什么会那么慢,select和insert只要几秒钟而已。我是用循环的方法来修改的,忘大侠指教,帮忙解决看下哪得问题或者有没有好的方法,万分紧急万分感谢!
private void 当前制作人ToolStripMenuItem_Click(object sender, EventArgs e)
{
progressBar1.Maximum = dataGridView1.RowCount;
progressBar1.Visible = true;
Cursor = Cursors.WaitCursor;
if (dataGridView1.SelectedRows.Count <= 0)
{
Cursor = Cursors.Default;
MessageBox.Show("请先选择要批量修改的整行!");
return;
}
else
{
int times = 0;
for (int i = 0; i < dataGridView1.RowCount; i++)
{
if (dataGridView1.Rows[i].Selected == true)
{
SqlDataset.SqlCommand("update 生产表 set 当前制作人=@当前制作人 where ID=@ID", new SqlParameter("ID", dataGridView1.Rows[i].Cells[0].Value.ToString().Trim()), new SqlParameter("当前制作人", textBox2.Text.Trim()));
dataGridView1.Rows[i].Cells[4].Value = textBox2.Text.Trim();
times++;
}
progressBar1.PerformStep();
}
progressBar1.Visible = false;
MessageBox.Show("成功修改了" + times.ToString() + "行制作人!");
}
Cursor = Cursors.Default;
}超级慢……
private void 当前制作人ToolStripMenuItem_Click(object sender, EventArgs e)
{
progressBar1.Maximum = dataGridView1.RowCount;
progressBar1.Visible = true;
Cursor = Cursors.WaitCursor;
if (dataGridView1.SelectedRows.Count <= 0)
{
Cursor = Cursors.Default;
MessageBox.Show("请先选择要批量修改的整行!");
return;
}
else
{
int times = 0;
for (int i = 0; i < dataGridView1.RowCount; i++)
{
if (dataGridView1.Rows[i].Selected == true)
{
SqlDataset.SqlCommand("update 生产表 set 当前制作人=@当前制作人 where ID=@ID", new SqlParameter("ID", dataGridView1.Rows[i].Cells[0].Value.ToString().Trim()), new SqlParameter("当前制作人", textBox2.Text.Trim()));
dataGridView1.Rows[i].Cells[4].Value = textBox2.Text.Trim();
times++;
}
progressBar1.PerformStep();
}
progressBar1.Visible = false;
MessageBox.Show("成功修改了" + times.ToString() + "行制作人!");
}
Cursor = Cursors.Default;
}超级慢……
问题就是出现在 dataGridView1.Rows[i].Cells[4].Value = textBox2.Text.Trim();
设置 dataGridView的值的问题,三千多行如果加上这句就会极其缓慢,如果注释掉就秒刷,这是问什么呢
如果 dataGridView1.SelectedRows == null 是不会执行 foreach 循环的3、建议在 SelectionChanged 事件中使用
button.Enabled = (
dataGridView1.SelectedRows.Count > 0 &&
textBox2.Text.Trim() != "");
来控制执行按钮是否可用4、然后,你遍历了整个列表,再次判断 row 是否被选中,完全是多余的5、最后,建议像这样的更新操作可以利用拼接 sql 语句的方法一次完成执行,当然,最有效的办法是数据绑定,然后 Rebind 或重新载入数据即可// 利用 "UPDATE 生产表 SET 当前制作人={0} WHERE ID IN ({1})" 拼接 sql
// 参数 "{0}" = textBox2.Text.Trim();
// 参数 "{1}" 可以利用 linq 直接获取// 如果 ID 是字符型数据
// 使用 string.Format("'{0}'", row.Cells["ID"]string sql =
string.Format("UPDATE 生产表 SET 当前制作人={0} WHERE ID IN ({1})",
textBox2.Text.Trim(),
string.Join(",", dataGridView1.SelectedRows
.Cast<System.Windows.Forms.DataGridViewRow>()
.Select(row => string.Format("{0}", row.Cells["ID"])).ToArray()));Console.WriteLine( sql );
如果你用的是数据绑定 应该更新的是 table 而不是 datagridview
你说的方法也可以,但是现在最大的问题就是给datagridview单元格赋值上会极大的影响速度,去掉这个的话速度就会快N倍。
学习了!感谢!