Windows アプリケーションに DataGridView コントロールがあります。
上記のコードを使用して、データをロードし、グリッドにバインドします。
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.code の 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) http://social.msdn.microsoft.com/Forums/en/winformsdatacontrols/thread/f824fbbf-9d08-4191-98d6-14903801acfc
2) datagridvew の同じ行のセルが編集モードのときに、他のセルをクリックします。 Operation is not valid reentrant call
3) InvalidOperationException - セルの編集を終了して別のセルに移動する場合
助けが必要です。
前もって感謝します !!