私は、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イベントで実現されています。ユーザーが新しい行にデータを入力したときと同じ結果を探しています。私は、ユーザーがすべての列にデータを入力することができるようにしたい、最後の列が編集されたときに新しい行が自動的に私のデータテーブルに挿入される必要があります。
あなたは成功したSQL Server内でストアドプロシージャを実行することができますか? – confusedandamused
はい。 CellEndEditコードを削除し、InsertメソッドをRowLeaveイベントから呼び出すと、挿入された行が受け入れられます。 – Wurm