Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c以相同的形式插入、删除和编辑LoadDataGridView_C#_Sql_Datagridview - Fatal编程技术网

C# c以相同的形式插入、删除和编辑LoadDataGridView

C# c以相同的形式插入、删除和编辑LoadDataGridView,c#,sql,datagridview,C#,Sql,Datagridview,我有一个4列的datagridview。其中1列是手动添加的deletecheckbox列,位于第一列。当我尝试根据选中的值删除多行时,会出现一些奇怪的行为。例如,如果我选中2行,则删除1行。如果我选中5行,则删除3行。所以我点击的内容基本上有一半被删除了。那些没有被删除的被选中,我必须再次点击更新按钮来删除更多。如果我想通过单击一个按钮删除所有复选框,我需要修复什么 整个按钮单击事件: private void button1_Click(object sender, EventArgs e)

我有一个4列的datagridview。其中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
只需将循环更改为:

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下面的部分对表达式求值,如果值不为null,则将其转换为字符串;如果值为null,则将其设置为

有点像这样:

variable = (Expression) ? (will be evaluated if true) : (will be evaluated if false)

非常感谢。但是,当我重新运行它时,如果DGV1.Rows[x].Cells[1].Value.ToString==| | DGV1.Rows[x].Cells[1].Value==null,则在第行中未设置错误对象引用,数据是一样的,为什么我会得到这个?你能把null测试移到th或的左边吗?然后首先测试它是否为NULL,如果它不是NULL,则测试另一个条件是否为空字符串。Null无法转换为字符串,因此它将引发错误。尝试以下操作:如果DGV1.Rows[x].Cells[1].Value==null | | | DGV1.Rows[x].Cells[1].Value.ToString==当我调试时,它现在会出现在if语句中,但第一行会导致相同的错误。cmdAdd.Parameters[@UserID].Value=DGV1.Rows[x].Cells[2].Value.ToString;发生这种情况的行可能有空字段。您能否在发生错误时检查x的值,并检查应转换的值?我最好的问题是你有一个新的没有价值的细胞。这又意味着该值为Null,不能再转换为字符串。对,我的目标是仅通过填写行向datagridview/数据库添加行,仅通过替换值编辑行,并根据复选框删除行。加载表单和datagridview时,最后一行显示n个未选中复选框,并在userID下显示一个空单元格以进行填写。
variable = (Expression) ? (will be evaluated if true) : (will be evaluated if false)