2017-04-10 63 views
0

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

我试图使用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语句。

有人可以给我一点方向,以便如何让一个新的行来调用插入方法吗?

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

+0

您能够成功运行SQL Server中的存储过程? – confusedandamused

+0

是的。如果我删除CellEndEdit代码,并从RowLeave事件调用Insert方法,它将接受插入的行。 – Wurm

回答

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 
+0

我通过输入dgvEmployee.EndEdit()解决了我的问题;在我的方法调用上方,以及进入dgvEmployeeBindGrid();用新行刷新DataGridView,它现在完美运行! – Wurm

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; 
     } 

    } 
+0

这使我可以更新数据并将其输入新行,但不会更新数据库。我已经尝试了SSMS的插入方法,它的工作原理。当我进入新行时,我没有收到错误,程序添加了一行并保留这一行,但未触及我的数据库。 – Wurm

+0

我的歉意,我忘记了分配RowLeave事件。现在,我收到一个InvalidCastException错误,指出“对象不能从DBNull转换为其他类型”。我输入员工姓名缩写,名字,姓氏和活动复选框。有一个employeeID字段应该自动添加到数据库中。 – Wurm

+0

不需要道歉:)很高兴看到你解决了你的问题。如果这种方法帮助你的问题,请将其标记为已回答,以便它可以帮助其他人...... – caner