我用两个DataGridView来显示主从表的数据,但是当查询出来的主表没有数据时就出错。代码如下
DataSet ds = GetData();
ds.Relations.Add ( "EmployeesInfo" , ds.Tables [ "dsTable" ].Columns [ "LoanBh" ] , 
                [align=left]ds.Tables [ "dsTable1" ].Columns [ "LoanBh" ] );
                BindingSource masterBindingSource = new BindingSource ( );
                BindingSource detailsBindingSource = new BindingSource ( );
                masterBindingSource.DataSource = ds;
                masterBindingSource.DataMember = "dsTable";
                detailsBindingSource.DataSource = masterBindingSource;
                detailsBindingSource.DataMember = "EmployeesInfo";
                this.dgvMaster.DataSource = masterBindingSource;
                this.dgvDetails.DataSource = detailsBindingSource;[/align]
当ds.Tables [ "dsTable" ]中没有数据时捕捉到 System.ArgumentException
  Message="不能启用此约束,因为不是所有的值都具有相应的父值。"的异常;
这时ds.Tables [ "dsTable1" ]是有数据的(从表是查询出所有的数据,根据Relations现实选中对应主表的从表信息)。只是对应不到主表!
问题:1:目前这种方式怎么解决这个问题?
问题:2:这种显示主从表数据的方式对不对?

解决方案 »

  1.   

    两个表设定主外键, 在 DataSet 内为两个表建立一个 DataRelation,从表对应的 DataGridView 绑定那个 DataRelation, 就好了查下 DataRelation 的文档就会了
      

  2.   

    你可以这样写!  select * from 主表
      select * from 子表
    同一个SQL语句里面! 然后返回dataset 数据的时候!  ds.tables[0]主表 ds.tables[1]子表...
      

  3.   

    你是说这样吗?DataRelation relation = new DataRelation ("EmployeesInfo" , ds.Tables [ "dsTable" ].Columns [ "LoanBh" ] , ds.Tables [ "dsTable1" ].Columns [ "LoanBh" ] );
    ds.Relations.Add (relation);
      

  4.   

    主表需要根据查询条件筛选数据,有可能为空,当为空的时候这种DataRelation好像就破坏了!
      

  5.   

    我查MSDN上就是这种做法,只是这种方法在没有查询条件的时候是正确的,有查询条件了就出错了。
    还有没有别的什么解决方法?
    难道只能点一下主表记录取它的ID在去从表查询数据再绑定么?
      

  6.   

    有查询条件时主表返回值就有可能为空,这时从表有数据,DataRelation这种关系就破坏了。因此就会出现
    “不能启用此约束,因为不是所有的值都具有相应的父值”这中错误!
      

  7.   

    ...DECLARE @COUNT VARCHAR(50)
    select @COUNT = count(*) from 主 where 查询条件
    if(@COUNT >0 )
    begion
      select * from 主 where 查询条件
      select * from 子 where 查询条件
    end这样不就可以吗?  
        也还有其他别的办法!你可以在想想!
      

  8.   

    找到两种可以解决这种方法显示主从表信息的办法
    第一种:   if ( ds.Tables [ "dsTable" ].Rows.Count == 0 )
       {
          ds.Tables [ "dsTable1" ].Clear ( );
       }第二种:在查询是用一条不可能的去查询从表,从而复制从表结构,
    经测试这两种方法都可以。
    当然就无奈的做法就是先查询主表,再在点击事件里获取主表的ID后查询从表,然后各自绑定。目前这种做法就免去了这些步骤。问题解决,谢谢各位的热心!