【发布时间】: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