2017-04-10 6 views
0

私は、C#でEmployeeクラスのストアドプロシージャを使用して編集可能なDataGridViewにデータを書き込んでいます。適切なDataTableを設定するためのグリッドを取得することができ、CellEndEditイベントを使用してUpdateメソッドを動作させることができます。グリッドの下部に空白の「新しい行」が表示され、ユーザーは新しい行を追加できます。しかし、私は新しい行を動作させることはできません。最初のセルにデータが取り込まれるとCellEndEditが呼び出されていると思われますが、残りのテーブルフィールドにはnull値があるためにエラーが発生します。
Insert、Update、Deleteを実行するためにEmployeeクラス内のメソッドを使用しているため、私は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コードを削除し、InsertメソッドをRowLeaveイベントから呼び出すと、挿入された行が受け入れられます。 – 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