Winforms RowLeave事件-操作无效,因为它导致对SetCurrentCellAddressCore函数的可重入调用
我在windows应用程序中有DataGridView控件。Winforms RowLeave事件-操作无效,因为它导致对SetCurrentCellAddressCore函数的可重入调用,winforms,datagridview,invalidoperationexception,Winforms,Datagridview,Invalidoperationexception,我在windows应用程序中有DataGridView控件。 我使用上述代码加载数据并将其绑定到网格 private void LoadData() { clsData objData = new clsData(); DataTable dtTemp = new System.Data.DataTable(); dtTemp = objData.GetDatatable(" SELECT [
我使用上述代码加载数据并将其绑定到网格
private void LoadData()
{
clsData objData = new clsData();
DataTable dtTemp = new System.Data.DataTable();
dtTemp = objData.GetDatatable(" SELECT [ID],[CustomerName],[OrderQty],[Price],[POStatus],[Remarks],[EstdShipDate],[ActualShipDate],[IsShipped] FROM [tblPO] ");
dgPO.DataSource = null;
dgPO.DataSource = dtTemp;
}
其中,dgPO是DataGrdiView(DGV)。现在,我想在用户离开该行时更新DGV中的记录。
为此,我使用了DGV的RowLeave事件
private void dgPO_RowLeave(object sender, DataGridViewCellEventArgs e)
{
int POId = Convert.ToString(dgPO.Rows[e.RowIndex].Cells[0].Value) == "" ? 0 : Convert.ToInt32(dgPO.Rows[e.RowIndex].Cells[0].Value);
string CustName = Convert.ToString(dgPO.Rows[e.RowIndex].Cells[1].Value);
int Qty = Convert.ToInt32(dgPO.Rows[e.RowIndex].Cells[2].Value);
decimal Price = Convert.ToDecimal(dgPO.Rows[e.RowIndex].Cells[3].Value);
string Status = Convert.ToString(dgPO.Rows[e.RowIndex].Cells[4].Value);
string Remarks = Convert.ToString(dgPO.Rows[e.RowIndex].Cells[5].Value);
string dtEsdt = Convert.ToDateTime(dgPO.Rows[e.RowIndex].Cells[6].Value).ToString("yyyy-MM-dd");
string dtActl = Convert.ToDateTime(dgPO.Rows[e.RowIndex].Cells[7].Value).ToString("yyyy-MM-dd");
bool Shipped = dgPO.Rows[e.RowIndex].Cells[8].Value == DBNull.Value ? false : Convert.ToBoolean(dgPO.Rows[e.RowIndex].Cells[8].Value);
string strQry = "";
if (POId > 0)
{
strQry = " UPDATE [tblPO] SET [CustomerName] = '" + PreString(CustName) + "',[OrderQty] = " + Qty + ",[Price] = " + Price + ",[POStatus] = '" + Status + "'";
strQry = strQry + ",[Remarks] = '" + PreString(Remarks) + "',[EstdShipDate] = '" + dtEsdt + "',[ActualShipDate] = '" + dtActl + "',[IsShipped] = '" + Shipped + "'";
strQry = strQry + " WHERE ID =" + POId;
}
else
{
strQry = " INSERT INTO [tblPO] ([CustomerName],[OrderQty],[Price],[POStatus],[Remarks],[EstdShipDate],[ActualShipDate],[IsShipped]) ";
strQry += " VALUES('" + PreString(CustName) + "'," + Qty + "," + Price + ",'" + PreString(Status) + "','" + PreString(Remarks) + "'";
strQry += " ,'" + PreString(dtEsdt) + "','" + PreString(dtActl) + "','" + Shipped + "')";
}
clsData objData = new clsData();
if (objData.ExecuteQuery(strQry))
{
LoadData();
}
}
在DB中更新数据时,我通过调用LoadData方法刷新DGV
在这一点上,我得到了这样的错误消息
“操作无效,因为它导致对SetCurrentCellAddressCore函数的可重入调用”
我在SO和MSDN博客上尝试了可用的解决方案,但它们不适合我
像这样
1) 2)
(三) 需要帮助。
提前谢谢 回答:
private void dgPO_RowLeave(object sender, DataGridViewCellEventArgs e)
{
dataGridView1.EndEdit();
//You code below
}
建议:替代方法
你试过使用和吗
在“RowLeave”或“EndEdit”方法中应用编辑之前,请使用以下检查:
这应该适用于任何正在编辑的单元格。(失去焦点时不应用编辑代码;键入Enter即可应用编辑)如何
。取消编辑
或。验证
?
private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
if (dataGridView1.IsCurrentRowDirty)
{
//Your code here
}
}
public void dgPO_RowLeave(object sender, DataGridViewCellEventArgs e)
{
if (!dgPO.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected)
return;
//...rest of your code to apply edit below...
}