C# 无法获取insert以使用datagridview

C# 无法获取insert以使用datagridview,c#,datagridview,C#,Datagridview,我正在用C语言编写一个程序,使用Employee类中的存储过程来填充可编辑的DataGridView。我可以使用适当的DataTable填充网格,并且可以使用CellEndEdit事件使更新方法工作。我看到网格底部的空白“新行”,允许用户添加一个新行。但是,我无法让新行工作。我相信在填充第一个单元格后,它会调用CellEndEdit,但由于剩余表字段中的空值,它会出错。 因为我使用Employee类中的方法来执行Insert、Update、Delete,所以我没有使用TableAdapter。我

我正在用C语言编写一个程序,使用Employee类中的存储过程来填充可编辑的DataGridView。我可以使用适当的DataTable填充网格,并且可以使用CellEndEdit事件使更新方法工作。我看到网格底部的空白“新行”,允许用户添加一个新行。但是,我无法让新行工作。我相信在填充第一个单元格后,它会调用CellEndEdit,但由于剩余表字段中的空值,它会出错。
因为我使用Employee类中的方法来执行Insert、Update、Delete,所以我没有使用TableAdapter。我相信我在这一点上的步骤应该是测试这是否是一个新行,如果是,我需要禁用CellEndEdit

我尝试按如下方式使用RowLeave事件:

 private void dgvEmployee_RowLeave(object sender, DataGridViewCellEventArgs e)
    {
        if (dgvEmployee.Rows[dgvEmployee.CurrentCell.RowIndex].IsNewRow)
        {
            EmployeeDataAccess empData = new EmployeeDataAccess();

            empData.InsertEmployee(dgvEmployee[1, e.RowIndex].Value.ToString(),
                                   dgvEmployee[2, e.RowIndex].Value.ToString(),
                                   dgvEmployee[3, e.RowIndex].Value.ToString(),
                                   Convert.ToInt32(dgvEmployee[4, e.RowIndex].Value));

        }
        else
        {
            return;
        }
我在CellEndEdit中尝试了这段代码,如果它是新行,则不执行:

 private void dgvEmployee_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvEmployee.Rows[dgvEmployee.CurrentCell.RowIndex].IsNewRow)
            {
                dgvEmployee.CellEndEdit -= new DataGridViewCellEventHandler(dgvEmployee_CellEndEdit);
                return;
            }
            else
            {
                EmployeeDataAccess empData = new EmployeeDataAccess();

                empData.UpdateEmployee(Convert.ToInt32(dgvEmployee[0, e.RowIndex].Value),
                                       dgvEmployee[1, e.RowIndex].Value.ToString(),
                                       dgvEmployee[2, e.RowIndex].Value.ToString(),
                                       dgvEmployee[3, e.RowIndex].Value.ToString(),
                                       Convert.ToInt32(dgvEmployee[4, e.RowIndex].Value));
            }
        }
我没有收到错误,但程序将不会执行Insert语句

有人能告诉我一些关于如何允许新行调用insert方法的指导吗

更新:我想说的是我没有使用按钮。当用户在DataGridView中编辑数据时,我需要在数据离开单元格时对其进行更新。这是通过CellEndEdit事件调用Update方法实现的。当用户在新行中输入数据时,我正在寻找相同的结果。我希望用户能够完成在所有列中输入数据,然后在编辑最后一列后,新行应自动插入到我的数据表中。

private bool\u newRow

    private void dgvEmployee_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        if(_newRow)
        {
            //cancel
        }
        else
        {
            //update
        }
    }

    private void dgvEmployee_UserAddedRow(object sender, DataGridViewRowEventArgs e)
    {
        _newRow = true;
    }

    private void dgvEmployee_RowLeave(object sender, DataGridViewCellEventArgs e)
    {
        if (_newRow)
        {
            //insert
            _newRow = false;
        }

    }

您是否能够在SQL Server中成功运行存储的进程?是。如果我删除CellEndEdit代码,并从RowLeave事件调用Insert方法,它将接受插入的行。这允许我更新数据并将数据输入新行,但它不会更新数据库。我尝试了SSMS中的insert方法,它很有效。当我进入新行时,我没有收到错误,程序添加了一行并离开这一行,但没有触及我的数据库。很抱歉,我忘记分配RowLeave事件。现在,我收到一个InvalidCastException错误,指出“无法将对象从DBNull转换为其他类型。”我正在输入员工的姓名首字母缩写、名字、姓氏和一个活动复选框。数据库中应自动添加employeeID字段。无需道歉:)很高兴看到您解决了问题。如果此方法有助于解决您的问题,请将此标记为已回答,以便对其他人有所帮助…此问题尚未解决。我现在得到的对象不能从DBNull转换为其他类型。是否检查了存储过程输出参数?您应该返回employeeID并绑定到您的专栏我通过输入dgVeEmployee.EndEdit()解决了我的问题;在我的方法调用上方,以及输入dgvEmployeeBindGrid();使用新行刷新DataGridView。现在它工作得很好!
 private void dgvEmployee_RowLeave(object sender, DataGridViewCellEventArgs e)
    {
        if (_newRow)
        {
            EmployeeDataAccess empData = new EmployeeDataAccess();
            dgvEmployee.EndEdit();

            empData.InsertEmployee(
                                   dgvEmployee[1, e.RowIndex].Value.ToString(),
                                   dgvEmployee[2, e.RowIndex].Value.ToString(),
                                   dgvEmployee[3, e.RowIndex].Value.ToString(),
                                   Convert.ToInt32(dgvEmployee[4, e.RowIndex].Value)
                                   );

            _newRow = false;
            dgvEmployeeBindGrid();
        }
        else
        {
            return;
        }
    }


public void InsertEmployee(string initials, string firstName, string lastName, int active)
    {
        using (SqlConnection conn = new SqlConnection(DatabaseConnection.NorthGA_WarpingTest))
        {
            conn.Open();
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "InsertEmployee";
                cmd.Parameters.AddWithValue("@Initials", initials);
                cmd.Parameters.AddWithValue("@FirstName", firstName);
                cmd.Parameters.AddWithValue("@LastName", lastName);
                cmd.Parameters.Add("@Active", SqlDbType.Bit).Value = active;
                cmd.ExecuteNonQuery();
            }
        }
    }


    @Initials varchar(3),
    @FirstName varchar(25),
    @LastName varchar(25),
    @Active bit

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here

INSERT INTO [Employee]
           ( 
             [Initals],
             [FName],
             [LName],
             [Active]         
            )

 VALUES (
          @Initials,
          @FirstName,
          @LastName,
          @Active
        )

END