以下是事实:
我想做什么:
dgvOrder是只读的。我用它来浏览记录ala BindingNavigator。 (我喜欢使用DataGridView来导航记录,因为它很直观。你会立即看到接下来几条记录的内容。)
要添加新记录,我使用“新”按钮(uxNewButton)。为了保存我的更新,我使用了“保存”按钮(uxSaveButton)。记录是使用文本框添加的,而不是直接通过dgvOrder添加。子记录直接通过dgvOrderDetails添加。
我猜,dgvOrderDetails非常明显 - 它包含Order的详细信息(1对多关系)。我的代码和配置:
将TableAdapterManager拖到设计器(tam)。
private void uxNewButton_Click(object sender,EventArgs e){
bsOrder.AddNew();
}
private void uxSaveButton_Click(object sender,EventArgs e){
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)
答案 0 :(得分:0)
在dgvOrderDetail的Enter事件上添加bsOrder.EndEdit()似乎可以解决问题,但我不确定这是否是最佳做法。