這裏的都是事實:家長的DataGridView不更新
- 我有一個父表,讓我們稱之爲訂單。使用DataGridView(dgvOrder)查看此表中的數據。
- 我有一個子表,我們稱之爲OrderDetails。使用DataGridView(dgvOrderDetails)查看此表中的數據我有文本框(以及複選框,組合框等),它們是Order表(使用BindingSource)的數據綁定。
- 我使用Visual Studio 2008
我想要做什麼:
dgvOrder是隻讀的。我用它來瀏覽記錄ala BindingNavigator。 (我喜歡使用DataGridView導航記錄,因爲它很直觀,你會立即看到接下來的幾條記錄是什麼。)
要添加新記錄,我使用「新建」按鈕(uxNewButton)。爲了保存我的更新,我使用了「保存」按鈕(uxSaveButton)。使用文本框添加記錄,而不是直接通過dgvOrder添加。子記錄直接通過dgvOrderDetails添加。
dgvOrderDetails,我想,很明顯 - 它包含訂單的細節(1對多關係)。
我的代碼和配置:
- Hierchical更新(在DataSet設計器)(在VS 2008中默認情況下)
- 秩序和的OrderDetail的關係被設定爲「既關係設置爲true和fk約束「。更新和刪除設置爲級聯。接受/拒絕規則設置爲「無」。嵌套關係未選中。
TableAdapterManager被拖到設計器(tam)。
私人無效uxNewButton_Click(對象發件人,EventArgs的){
bsOrder.AddNew();
}
私人無效uxSaveButton_Click(對象發件人,EventArgs的){
this.Validate(); bsOrder.EndEdit(); bsOrderDetails.EndEdit(); tam.UpdateAll(dsOrder); //DataSet is named dsOrder. try-catch block excluded for simplicity
}
問題:
填滿所有的文本框(等)和dgvOrderDetails,擊中保存按鈕將導致錯誤後:ForeignKeyConsraint FK_Orderchild_Order要求孩子鍵值(-1)在父表中存在。
但是,如果我直接使用dgvOrder(然後dgvOrderDetails)添加記錄,則點擊保存按鈕將成功保存。
我還發現,如果我使用文本框添加新記錄,但必須在dgvOrder中選擇不同的行,然後在dgvOrderDetails上添加記錄之前再次選擇當前行,才能保存成功。
看起來像通過文本框添加新記錄時,基礎數據不會與DataGridView同步。選擇不同的行,然後選擇返回當前行同時完成數據。
我在像保存事件嘗試了各種黑客:
dgvOrder.Refresh(); //or
dgvOrder.Invalidate();
dgvOrder.Refresh(); // or
dgvOrder.Parent = null;
Controls.Add(dgvOrder);
//and so on and so forth (suggetstions from Google searches)
我忘記提到在調用tam.UpdateAll()之前通過編程方式移動dgvOrder選項並不能解決問題。 – tonex
在dgvOrderDetail的Enter事件中添加bsOrder.EndEdit()似乎解決了這個問題,但我不確定這是否是最佳實踐。 – tonex