在DATASET中,一旦建立了关系后,系统会自动进行一致性校验的,好象可以通过数据库中设置外键允许为空来实现(听说的,没试过)
DATASET存在着与数据相对应的各个缓冲池,可能数据没被写入主数据缓冲池中吧.

解决方案 »

  1.   

    我指的就是DataSet中的主键与外键,不是数据库中的。我已经指出了这个DataSet不与任何数据库或表关联。我的修改仅仅在DataSet中。最终将它序列化保存。
      

  2.   

    DataSet.AccepetChanges()方法我调用了,似乎无用。注意,用Clear()后再Merge(),能实现我的意愿。这两个问题是同一个模块的。
      

  3.   

    1 DataSet设置了Relation了吗,下面的代码没有出现上述的问题
    ds=new DataSet();
    SqlDataAdapter sda=new SqlDataAdapter("select * from orders",sqlConnection1);\\sqlConnection1连接Sql Server数据库NorthWind
    sda.Fill(ds,"orders");
    ds.Tables["orders"].Columns["CustomerID"].ReadOnly=true;
    sda.SelectCommand.CommandText="select * from customers";
    sda.Fill(ds,"customers");
    ds.Relations.Add(ds.Tables["customers"].Columns["CustomerID"],ds.Tables["orders"].Columns["CustomerID"]);
    this.dataGrid1.DataSource=ds;
    this.dataGrid1.DataMember="customers";2 这种情况一般使用一个静态的DataSet可以避免很多麻烦。
      

  4.   

    不设置 Relation 能 Navigate 吗?肯定是设置的了。我的 DataGrid 不在主窗体上。在给修改数据的窗体传递 DataSet 时出现我所不能理解的现象。关于子行的外键值自动赋值问题,我在测试时发现一般在添加第一个父行时,显得正常。在以后的父行添加时,就会出现子行的外键字段值自动设置为 (空)。
    请注意我所描述的操作细节,主要是细节上的问题。细节:不离开父行直接进入子行中进行操作。
    此时可能刚添加的父行没有得到刷新,可能在 Navigate 事件中进行一些特殊处理来解决吧。我要防止这种操作上的不便性,我总不能提醒用户要先离开一下该父行后再进行子行的添加吧。
      

  5.   

    第一问题深究一下挺有意思的,我也觉得这是个Bug。    接着上面的代码,在窗体加入一个TextBox,在Navigate事件中加入下面代码:
    private void dataGrid1_Navigate(object sender, System.Windows.Forms.NavigateEventArgs ne)
    {
    textBox1.Text=ds.Tables["customers"].Rows[ds.Tables["customers"].Rows.Count-1]["CustomerID"].ToString();this.BindingContext[this.dataGrid1.DataSource,"customers"].Position=this.BindingContext[this.dataGrid1.DataSource,"customers"].Count-1;
    }
        
        运行结果说明,如果以“正常”的步骤进入子表,那么DataGrid的内部代码会执行一个方法,设置子表的显示项。从上面代码的运行结果可以知道,这个内部方法的执行相当于在子表应用过滤条件“子表外键='主表绑定源当前项的主键值'”。
        奇怪的是,按照你所述的步骤进行,运行结果清楚地说明了:好像这个方法没有被调用。