使用TableAdapterManager的分层更新时,父DataGridView不会更新

时间:2012-01-20 12:05:27

标签: c# datagridview

以下是事实:

  1. 我有一个父表,我们称之为Order。使用DataGridView(dgvOrder)查看此表中的数据。
  2. 我有一个子表,我们称之为OrderDetails。使用DataGridView(dgvOrderDetails)
  3. 查看此表中的数据
  4. 我有文本框(以及复选框,组合框等),它们数据绑定到Order表(使用BindingSource)。
  5. 我正在使用Visual Studio 2008。
  6. 我想做什么:

    dgvOrder是只读的。我用它来浏览记录ala BindingNavigator。 (我喜欢使用DataGridView来导航记录,因为它很直观。你会立即看到接下来几条记录的内容。)

    要添加新记录,我使用“新”按钮(uxNewButton)。为了保存我的更新,我使用了“保存”按钮(uxSaveButton)。记录是使用文本框添加的,而不是直接通过dgvOrder添加。子记录直接通过dgvOrderDetails添加。

    我猜,dgvOrderDetails非常明显 - 它包含Order的详细信息(1对多关系)。

    我的代码和配置:

    • Hierchical Update(在数据集设计器中)设置为true(默认情况下在VS 2008中)
    • Order和OrderDetail之间的关系设置为“关系和fk约束”。更新和删除设置为级联。接受/拒绝规则设置为“无”。嵌套关系未选中。
    • 将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)
    

1 个答案:

答案 0 :(得分:0)

在dgvOrderDetail的Enter事件上添加bsOrder.EndEdit()似乎可以解决问题,但我不确定这是否是最佳做法。