您好,请教一下,我们从库存表MaterialStock的查询内容,想直接在datagridview内修改保存,查询结果包含这几列-- "MaterialID", "MaterialName", "BatchNumber","TotalQuantity","Remaining","EntryDate",另外, BatchID是我们数据表内自增长的ID列,没有体现在查询结果内,以下是示例代码,请帮我完善一下,实现上述目标,谢谢;
private readonly List<string> AllowedColumns = new List<string>
{
"MaterialID", "MaterialName", "BatchNumber","TotalQuantity","Remaining","EntryDate"
};
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0 || dataGridView1.Rows[e.RowIndex].IsNewRow) return;
try
{
string columnName = dataGridView1.Columns[e.ColumnIndex].Name;
// 验证列名是否允许编辑
if (!AllowedColumns.Contains(columnName))
{
MessageBox.Show("不允许编辑此列!");
dataGridView1.CancelEdit();
return;
}
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
// 获取修改后的值
var row = dataGridView1.Rows[e.RowIndex];
object cellValue = row.Cells[e.ColumnIndex].Value;
int BatchId = Convert.ToInt32(row.Cells["BatchID"].Value);
// 更新数据库
using (var cmd = new SqlCommand(
@"UPDATE MaterialStock
SET " + columnName + @" = @CellValue
WHERE BatchID = @",
conn))
{
// 使用参数化查询防止SQL注入
cmd.Parameters.AddWithValue("@CellValue", cellValue ?? DBNull.Value);
cmd.Parameters.AddWithValue("@BatchID", BatchId);
int rowsAffected = cmd.ExecuteNonQuery();
if (rowsAffected == 0)
{
throw new Exception("数据已被其他用户修改,请刷新后重试!");
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"更新失败:{ex.Message}");
dataGridView1.CancelEdit(); // 撤销单元格修改
}
}