两个datagridview--dgv1,dgv2 分别显示主表和明细表的数据,该怎么做dgv1绑定到表T1,有关键字段F1,dgv2绑定到表T2,通过字段F2与表T1的F1关联。
当点击dgv1的某行时,dgv2显示表T2中字段f2等于表T1的F1字段的数据,具体该怎么做?
是不是需要在数据集中添加关系啊?

解决方案 »

  1.   

    不需要。写dgv1的行改变事件即可
      

  2.   


    对于不需要在明细报表中进行添加操作的情况下可以这样做,但是如果想在明细报表中利用datagridview的添加、修改、删除等功能,还是添加关系方便些。
    这里就不讨论用dgv1的行改变事件的方法了
      

  3.   

    通过事件处理
    GridView点击事件后,取出主表信息,根据主表信息查询数据绑定字表的GridView
      

  4.   

    不错。
    DataRelation relation = new DataRelation("关系名",
        dataset.Tables["主表"].Columns["F1"],
        dataset.Tables["明细表"].Columns["F2"]);
        dataset.Relations.Add(relation);
      

  5.   

    这里有个详细的例子:
    http://technet.microsoft.com/zh-cn/magazine/y8c0cxey(VS.85).aspx
      

  6.   

    与一般表不同的是,主要要解决删除主表记录时,子表相关记录应如何处理的问题
    除了关系外,再添加外键约束
    DataRelation relation = new DataRelation("关系名",
        dataset.Tables["主表"].Columns["F1"],
        dataset.Tables["子表"].Columns["F2"], false);
    dataset.Relations.Add(relation);ForeignKeyConstraint constraint= new ForeignKeyConstraint("关系名",
        dataset.Tables["主表"].Columns["F1"],
        dataset.Tables["子表"].Columns["F2"]);
    constraint.DeleteRule = Rule.SetNull;    //删除主表记录时,同时删除子表相关记录
    constraint.UpdateRule = Rule.Cascade;
    constraint.AcceptRejectRule = AcceptRejectRule.Cascade;
    dataset.Tables["子表"].Constraints.Add(constraint)
    dataSet.EnforceConstraints = true;也可以使用向导:
    http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(VS.DATASOURCE.REALTIONBUILDER);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22)&rd=true
    最后,若在数据库内同时定义了外键约束,则提交时应使用TableAdapterManager的UpdateAll方法
      

  7.   

    DataRelation relation = new DataRelation("关系名",
        dataset.Tables["主表"].Columns["F1"],
        dataset.Tables["子表"].Columns["F2"], false);
    dataset.Relations.Add(relation);ForeignKeyConstraint constraint= new ForeignKeyConstraint("关系名",
        dataset.Tables["主表"].Columns["F1"],
        dataset.Tables["子表"].Columns["F2"]);
    constraint.DeleteRule = Rule.SetNull;    //删除主表记录时,同时删除子表相关记录
    constraint.UpdateRule = Rule.Cascade;
    constraint.AcceptRejectRule = AcceptRejectRule.Cascade;
    dataset.Tables["子表"].Constraints.Add(constraint)
    dataSet.EnforceConstraints = true;
      

  8.   


    如果是仅是明细表更改了,是不是也得执行dataset的update才能完成数据的入库操作?
      

  9.   

    原理上是不用。因为ForeignKeyConstraint只涉及主表更改后,子表应该怎么样。
    其实也没什么关系,如果主表没做更改,Update整个DataSet也不会有太多额外开销我上面的“constraint.DeleteRule = Rule.SetNull; //删除主表记录时,同时删除子表相关记录”
    错了,删除的话,应该是Rule.Cascade
      

  10.   

    主从表各有一个dataAdapter,是不是调用主表的dataAdapter就能同时更新明细表的内容了?
      

  11.   

    不是的。
    如果数据库内部没有再定义这样的外键约束的话,就像普通表一样,为各自的dataAdapter调用Update就可以了。
    而有时侯为了确保这种外键关系,会在数据库内部也定义同样的外键约束,这时侯提交应使用TableAdapterManager
    仅含一个关系时,它类似于这样的提交机制:
    子表TableAdapter.Update(子表.GetChanges(DataRowState.Deleted));
                主表TableAdapter.Update(主表);
                子表TableAdapter.Update(子表.GetChanges(DataRowState.Modified));
                子表TableAdapter.Update(子表.GetChanges(DataRowState.Added));
      

  12.   

    数据库内没定义外键约束啊,然后分别调用Update,出错: 
    Update 无法找到 TableMapping['Table'] 或 DataTable“Table”。
      

  13.   

    你可以单独Update(主表),Update(子表)
      

  14.   


    主表的主键是自增的,通过在主dgv的CellEndEdit事件中完成一次主表的update,但是好像还是有问题,如在删除主记录然后保存时出现错误:
    违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条这种方式不太可靠啊
      

  15.   

    数据库中主表主键是自动编号的吗?另外检查一下有没有只提交,而没AcceptChanges,或只AcceptChanges而没提交的情况。这种方法就是为了保证数据关联的手段,本质就是额外的检查和操作,没什么不可靠的说法。而抛出异常,恰恰是检查机制起了作用,而lz的错误也未必全是它引起的啊如果使用向导进行数据绑定和关系及约束的添加应该就会感觉容易的多。
      

  16.   

    C#的主从表操作比Delphi要麻烦不少.