无法使用datagridview进行插入

时间:2017-04-10 13:09:07

标签: c# datagridview

我正在使用Employee类中的存储过程在C#中编写一个程序来填充可编辑的DataGridView。我可以使用适当的DataTable来填充网格,并且可以通过使用CellEndEdit事件来使Update方法工作。我看到空白的"新行"在网格的底部,允许用户添加新行。但是,我无法让新行工作。我相信它在填充第一个单元格后调用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中的数据时,我需要在离开单元格时更新数据。这是通过调用Update方法的CellEndEdit事件完成的。当用户在New Row中输入数据时,我正在寻找相同的结果。我希望用户能够在所有列中完成输入数据,然后在编辑完最后一列时,新行应自动插入到我的数据表中。

2 个答案:

答案 0 :(得分:0)

private bool _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;
        }

    }

答案 1 :(得分:0)

 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