我正在使用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中输入数据时,我正在寻找相同的结果。我希望用户能够在所有列中完成输入数据,然后在编辑完最后一列时,新行应自动插入到我的数据表中。
答案 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