Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TableAdapterManager';分层更新_C#_Datagridview - Fatal编程技术网

C# 使用TableAdapterManager';分层更新

C# 使用TableAdapterManager';分层更新,c#,datagridview,C#,Datagridview,以下是事实: 我有一个父表,我们称之为Order。使用DataGridView(dgvOrder)查看此表中的数据 我有一个子表,我们称之为OrderDetails。使用DataGridView(dgvOrderDetails)查看此表中的数据 我有文本框(以及复选框、组合框等),它们被数据绑定到订单表(使用BindingSource) 我正在使用VisualStudio2008 我想做什么: dgvOrder是只读的。我使用它来浏览BindingNavigator中的记录。(我喜欢使用Data

以下是事实:

  • 我有一个父表,我们称之为Order。使用DataGridView(dgvOrder)查看此表中的数据
  • 我有一个子表,我们称之为OrderDetails。使用DataGridView(dgvOrderDetails)查看此表中的数据
  • 我有文本框(以及复选框、组合框等),它们被数据绑定到订单表(使用BindingSource)
  • 我正在使用VisualStudio2008
  • 我想做什么:

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

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

    我想,dgvOrderDetails是非常明显的——它包含订单的细节(1对多关系)

    我的代码和配置:

    • 层次结构更新(在数据集设计器中)设置为true(在VS 2008中默认)
    • 订单和OrderDetail之间的关系设置为“关系和fk约束”。更新和删除设置为级联。接受/拒绝规则设置为“无”。嵌套关系未选中
    • TableAdapterManager被拖动到设计器(tam)

      私有void uxNewButton_单击(对象发送方,事件参数e){

      }

      私有void uxSaveButton_单击(对象发送者,事件参数e){

      }

    问题:

    填充所有文本框(等)和dgvOrderDetails后,点击save按钮将导致错误:ForeignKeyConsraint FK_Orderchild_Order要求父表中存在子键值(-1)

    但是,如果我直接使用dgvOrder(然后是dgvOrderDetails)添加记录,则点击保存按钮将成功保存

    我还发现,如果我使用文本框添加新记录,但必须在dgvOrder中选择另一行,然后在dgvOrderDetails上添加记录之前再次选择当前行,则可以成功保存

    似乎在通过文本框添加新记录时,底层数据未与DataGridView同步。选择另一行,然后选择回当前行,将同步所有数据

    我在save事件中尝试过各种黑客攻击,如:

    dgvOrder.Refresh(); //or
    
    dgvOrder.Invalidate();
    dgvOrder.Refresh(); // or
    
    dgvOrder.Parent = null;
    Controls.Add(dgvOrder);
    
    //and so on and so forth (suggetstions from Google searches)
    

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

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

    我忘记了在调用tam.UpdateAll()之前以编程方式移动dgvOrder选择并不能解决问题。添加bsOrder.EndEdit()在dgvOrderDetail的Enter事件上,似乎可以解决问题,但我不确定这是否是最佳做法。我忘记提到在调用tam.UpdateAll()之前以编程方式移动dgvOrder选择并不能解决问题。添加bsOrder.EndEdit()在DGVORDERDETAILE的Enter事件中,似乎可以解决问题,但我不确定这是否是最佳实践。
        this.Validate();
        bsOrder.EndEdit();
        bsOrderDetails.EndEdit();
    
        tam.UpdateAll(dsOrder); //DataSet is named dsOrder. try-catch block excluded for simplicity
    
    dgvOrder.Refresh(); //or
    
    dgvOrder.Invalidate();
    dgvOrder.Refresh(); // or
    
    dgvOrder.Parent = null;
    Controls.Add(dgvOrder);
    
    //and so on and so forth (suggetstions from Google searches)