c# 以相同的形式插入、删除和编辑加载数据网格视图
c# Insert,Delete, and Edit in Same form load datagridview
我有一个包含 4 列的数据网格视图。其中1个是手动添加的deletecheckbox列(第一列)。当我尝试根据选中的值删除多行时,出现了一些奇怪的行为。例如,如果我检查 2 行,则删除 1 行。如果我检查 5 行,则删除 3 行。所以基本上我点击的一半都被删除了。那些没有被删除的仍然被选中,我将不得不再次单击更新按钮以删除更多。如果我想一键删除所有选中的复选框,我需要修复什么?
整个按钮点击事件:
private void button1_Click(object sender, EventArgs e)
{
SqlCommand cmdAdd = new SqlCommand("insert into Josh_REL_Table (UserID, RoleName) Values (@UserID,@RoleName)", con);
SqlCommand cmdEdit = new SqlCommand("update Josh_Rel_Table SET UserID = @UserId, RoleName=@RoleName where RelationID=@RelationID", con);
con.Open();
cmdAdd.Parameters.Add("@UserID", SqlDbType.VarChar);
cmdAdd.Parameters.Add("@RoleName", SqlDbType.VarChar);
cmdAdd.Parameters.Add("@RelationID", SqlDbType.VarChar);
cmdEdit.Parameters.Add("@UserID", SqlDbType.VarChar);
cmdEdit.Parameters.Add("@RoleName", SqlDbType.VarChar);
cmdEdit.Parameters.Add("@RelationID", SqlDbType.VarChar);
if (DGV1.RowCount >= 1)
{
for (int x = 0; x < DGV1.RowCount - 1; x++)
{
if (DGV1.Rows[x].Cells[1].Value.ToString() == "" || DGV1.Rows[x].Cells[1].Value == null)
{
cmdAdd.Parameters["@UserID"].Value = DGV1.Rows[x].Cells[2].Value.ToString();
cmdAdd.Parameters["@RoleName"].Value = comboBox1.Text;
cmdAdd.Parameters["@RelationID"].Value = DGV1.Rows[x].Cells[1].Value.ToString();
cmdAdd.ExecuteNonQuery();
}
if (!DGV1.Rows[x].IsNewRow)
{
cmdEdit.Parameters["@UserID"].Value = DGV1.Rows[x].Cells[2].Value.ToString();
cmdEdit.Parameters["@RoleName"].Value = comboBox1.Text;
cmdEdit.Parameters["@RelationID"].Value = DGV1.Rows[x].Cells[1].Value.ToString();
cmdEdit.ExecuteNonQuery();
}
if (Convert.ToBoolean(DGV1.Rows[x].Cells[0].Value))
{
List<DataGridViewRow> selectedRows = (from newRow in DGV1.Rows.Cast<DataGridViewRow>() where Convert.ToBoolean(newRow.Cells["Delete"].Value) == true select newRow).ToList();
if (MessageBox.Show(string.Format("Do you want to delete {0} rows?", selectedRows.Count), "Confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
foreach (DataGridViewRow newRow in selectedRows)
{
using (SqlCommand cmd = new SqlCommand("DELETE FROM Josh_REL_Table WHERE RelationID = @RelationID", con))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@RelationID", newRow.Cells["RelationID"].Value);
cmd.ExecuteNonQuery();
DGV1.Rows.Remove(newRow);
}
}
}
}
}
}
MessageBox.Show("Record updated!");
con.Close();
}
您应该向后删除行,从最后一行开始一直到第一行,否则索引是错误的。假设您要删除索引为 2 和 4 的行:
index actual row
1 Row 1
2 Row 2 <-- If you delete this
3 Row 3
4 Row 4
5 Row 5
这基本上意味着在删除索引为 2 的行后,您将继续索引为 3 的行,该行现在是第 4 行,因此您从未处理过第 3 行应该发生的事情:
删除后你登陆这里
index actual row
1 Row 1
2 Row 3
3 Row 4
4 Row 5
只需将循环更改为:
for (int x = DGV1.RowCount - 1; x >= 0; ; x--)
表达式部分:
任何地方你都假设你有一个单元格值,你想转换成一个字符串,但可能是 null 需要被转义,否则你会收到一个错误:
// Old
cmdEdit.Parameters["@UserID"].Value = DGV1.Rows[x].Cells[2].Value.ToString();
// New
cmdEdit.Parameters["@UserID"].Value = (DGV1.Rows[x].Cells[2].Value != null) ? DGV1.Rows[x].Cells[2].Value.ToString() : "";
new 下面的部分计算表达式,如果不为空则将值转换为字符串,如果为空则将值设置为“”。
有点像这样:
variable = (Expression) ? (will be evaluated if true) : (will be evaluated if false)
我有一个包含 4 列的数据网格视图。其中1个是手动添加的deletecheckbox列(第一列)。当我尝试根据选中的值删除多行时,出现了一些奇怪的行为。例如,如果我检查 2 行,则删除 1 行。如果我检查 5 行,则删除 3 行。所以基本上我点击的一半都被删除了。那些没有被删除的仍然被选中,我将不得不再次单击更新按钮以删除更多。如果我想一键删除所有选中的复选框,我需要修复什么?
整个按钮点击事件:
private void button1_Click(object sender, EventArgs e)
{
SqlCommand cmdAdd = new SqlCommand("insert into Josh_REL_Table (UserID, RoleName) Values (@UserID,@RoleName)", con);
SqlCommand cmdEdit = new SqlCommand("update Josh_Rel_Table SET UserID = @UserId, RoleName=@RoleName where RelationID=@RelationID", con);
con.Open();
cmdAdd.Parameters.Add("@UserID", SqlDbType.VarChar);
cmdAdd.Parameters.Add("@RoleName", SqlDbType.VarChar);
cmdAdd.Parameters.Add("@RelationID", SqlDbType.VarChar);
cmdEdit.Parameters.Add("@UserID", SqlDbType.VarChar);
cmdEdit.Parameters.Add("@RoleName", SqlDbType.VarChar);
cmdEdit.Parameters.Add("@RelationID", SqlDbType.VarChar);
if (DGV1.RowCount >= 1)
{
for (int x = 0; x < DGV1.RowCount - 1; x++)
{
if (DGV1.Rows[x].Cells[1].Value.ToString() == "" || DGV1.Rows[x].Cells[1].Value == null)
{
cmdAdd.Parameters["@UserID"].Value = DGV1.Rows[x].Cells[2].Value.ToString();
cmdAdd.Parameters["@RoleName"].Value = comboBox1.Text;
cmdAdd.Parameters["@RelationID"].Value = DGV1.Rows[x].Cells[1].Value.ToString();
cmdAdd.ExecuteNonQuery();
}
if (!DGV1.Rows[x].IsNewRow)
{
cmdEdit.Parameters["@UserID"].Value = DGV1.Rows[x].Cells[2].Value.ToString();
cmdEdit.Parameters["@RoleName"].Value = comboBox1.Text;
cmdEdit.Parameters["@RelationID"].Value = DGV1.Rows[x].Cells[1].Value.ToString();
cmdEdit.ExecuteNonQuery();
}
if (Convert.ToBoolean(DGV1.Rows[x].Cells[0].Value))
{
List<DataGridViewRow> selectedRows = (from newRow in DGV1.Rows.Cast<DataGridViewRow>() where Convert.ToBoolean(newRow.Cells["Delete"].Value) == true select newRow).ToList();
if (MessageBox.Show(string.Format("Do you want to delete {0} rows?", selectedRows.Count), "Confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
foreach (DataGridViewRow newRow in selectedRows)
{
using (SqlCommand cmd = new SqlCommand("DELETE FROM Josh_REL_Table WHERE RelationID = @RelationID", con))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@RelationID", newRow.Cells["RelationID"].Value);
cmd.ExecuteNonQuery();
DGV1.Rows.Remove(newRow);
}
}
}
}
}
}
MessageBox.Show("Record updated!");
con.Close();
}
您应该向后删除行,从最后一行开始一直到第一行,否则索引是错误的。假设您要删除索引为 2 和 4 的行:
index actual row
1 Row 1
2 Row 2 <-- If you delete this
3 Row 3
4 Row 4
5 Row 5
这基本上意味着在删除索引为 2 的行后,您将继续索引为 3 的行,该行现在是第 4 行,因此您从未处理过第 3 行应该发生的事情:
删除后你登陆这里
index actual row
1 Row 1
2 Row 3
3 Row 4
4 Row 5
只需将循环更改为:
for (int x = DGV1.RowCount - 1; x >= 0; ; x--)
表达式部分:
任何地方你都假设你有一个单元格值,你想转换成一个字符串,但可能是 null 需要被转义,否则你会收到一个错误:
// Old
cmdEdit.Parameters["@UserID"].Value = DGV1.Rows[x].Cells[2].Value.ToString();
// New
cmdEdit.Parameters["@UserID"].Value = (DGV1.Rows[x].Cells[2].Value != null) ? DGV1.Rows[x].Cells[2].Value.ToString() : "";
new 下面的部分计算表达式,如果不为空则将值转换为字符串,如果为空则将值设置为“”。
有点像这样:
variable = (Expression) ? (will be evaluated if true) : (will be evaluated if false)