现做一个东西,就是在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;
        }超级慢……

解决方案 »

  1.   

    加个事件来判断下,是哪行进行了修改,然后写语句,具体我在DataGridView中没有试过,但是比你循环应该快点
      

  2.   

    感谢你的回复,我找到问题出在哪了
    问题就是出现在   dataGridView1.Rows[i].Cells[4].Value = textBox2.Text.Trim();
    设置 dataGridView的值的问题,三千多行如果加上这句就会极其缓慢,如果注释掉就秒刷,这是问什么呢
      

  3.   

    用事件获得修改的行和列,然后对这行的数据进行Update
      

  4.   

    应该是这里存在给gridview单元格重新赋值的问题
      

  5.   

    楼主概念不清啊~!1、dataGridView1.SelectedRows.Count 是不可能小于零2、直接用 foreach 循环就可以
       如果 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 );
      

  6.   


    如果你用的是数据绑定 应该更新的是 table 而不是 datagridview
      

  7.   

    dataGridView1.SelectedRows.Count 小于零是为了防止用户一行都没有选
    你说的方法也可以,但是现在最大的问题就是给datagridview单元格赋值上会极大的影响速度,去掉这个的话速度就会快N倍。
    学习了!感谢!
      

  8.   

    死脑经了吧为什么一定要手动更新 DataGridView 呢你一次更新完,重新绑定一次试试。速度提高 N 倍
      

  9.   

    强烈建议lz把要更新的sql语句整合成一条去操作。