【问题标题】:Updating data of selected row in datagridview更新datagridview中选定行的数据
【发布时间】:2015-12-09 14:34:12
【问题描述】:

我有带有复选框列的 datagridview,我想在单击按钮时更新一个值。待定状态 = 0 和已批准状态 = 1。如果我编码

UPDATE pending SET status='1' WHERE status='0'

所有 status='0' 将是 '1' 即使是没有检查的行。我只想将所选行的状态更新为 1。我的代码如下:

private void btnApproved_Click(object sender, EventArgs e)
    {


        List<DataGridViewRow> selectedRows = (from row in gvPending.Rows.Cast<DataGridViewRow>() where Convert.ToBoolean(row.Cells["checkBoxColumn"].Value) == true select row).ToList();
        if (MessageBox.Show(string.Format("Do you want to approve these rows?"), "Confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            foreach (DataGridViewRow row in selectedRows)
            {
                using (var connect = sqlcon.getConnection())
                {
                    using (SqlCommand cmd = new SqlCommand("UPDATE pending SET status='1' WHERE /* checkboxColumnValue is true */  "))
                    {
                        cmd.Connection = connect;
                        connect.Open();
                        //cmd.ExecuteNonQuery();
                        //connect.Close();

                    }
                }
            }
            this.BindGrid();
            //this.BindGrid1();
            //this.BindGrid2();
        }
    }

有什么建议或更正吗?谢谢!

【问题讨论】:

  • 虽然选择的答案提供了足够好的解决方案,但您应该注意各种问题。在处理 SQL 查询时,您应该始终依赖参数化而不是纯字符串 (msdn.microsoft.com/en-us/library/yy6y35y8(v=vs.110).aspx)。您的代码中的另一个问题是它连接的次数与给定集合中的元素一样多,这是一个非常低效的过程;您应该更好地在循环中构建查询(例如,以“UPDATE pending SET ...”开头的字符串变量并添加所有与 OR 链接的 ID=val)并随后连接
  • 最后,请注意构建初始selectedRows 集合并不是严格要求的(= 不必要的时间和内存资源浪费),除非需要用户干预。也就是说:如果您需要在进入主循环之前检查是否有符合您条件的案例,那很好(即,像FirstOrDefault 甚至Count 这样的另一个查询会更快,但不会更快)。在任何其他情况下(即立即执行分析),您应该避免初始查询并直接遍历所有行(通过检查row.Cells["checkBoxColumn"].Value)。

标签: c# sql winforms datagridview


【解决方案1】:

假设您的数据库主键名为 ID,并且它位于网格的位置 0,那么您应该能够在命令中使用 ID 仅修改该记录。

using (var connect = sqlcon.getConnection())
{
    string updateRecordCmd = String.Format( "UPDATE pending SET status='1' WHERE ID={0}",row.Cells[0].Value.toString());  
    using (SqlCommand cmd = new SqlCommand(updateRecordCmd))
    {
        cmd.Connection = connect;
        connect.Open();
        //cmd.ExecuteNonQuery();
        //connect.Close();

    }
}

祝你好运!

【讨论】:

  • @PaulEmmanuelAustria 虽然这个答案基本上是在回答你的问题,但它很不完整,并且没有在你的代码中提到各种问题。看看我上面的 cmets 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
相关资源
最近更新 更多