用DataGridView显示主从表的问题

happymugua 2009-03-30 09:32:32
我用两个DataGridView来显示主从表的数据,但是当查询出来的主表没有数据时就出错。代码如下

DataSet ds = GetData();
ds.Relations.Add ( "EmployeesInfo" , ds.Tables [ "dsTable" ].Columns [ "LoanBh" ] ,
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;



当ds.Tables [ "dsTable" ]中没有数据时捕捉到 System.ArgumentException
Message="不能启用此约束,因为不是所有的值都具有相应的父值。"的异常;
这时ds.Tables [ "dsTable1" ]是有数据的(从表是查询出所有的数据,根据Relations现实选中对应主表的从表信息)。只是对应不到主表!
问题:1:目前这种方式怎么解决这个问题?
问题:2:这种显示主从表数据的方式对不对?
...全文
722 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
happymugua 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hecong875 的回复:]
...

SQL code
DECLARE @COUNT VARCHAR(50)
select @COUNT = count(*) from 主 where 查询条件
if(@COUNT >0 )
begion
select * from 主 where 查询条件
select * from 子 where 查询条件
end



这样不就可以吗?
也还有其他别的办法!你可以在想想!
[/Quote]
找到两种可以解决这种方法显示主从表信息的办法
第一种:

if ( ds.Tables [ "dsTable" ].Rows.Count == 0 )
{
ds.Tables [ "dsTable1" ].Clear ( );
}

第二种:在查询是用一条不可能的去查询从表,从而复制从表结构,
经测试这两种方法都可以。
当然就无奈的做法就是先查询主表,再在点击事件里获取主表的ID后查询从表,然后各自绑定。目前这种做法就免去了这些步骤。

问题解决,谢谢各位的热心!
hecong875 2009-03-30
  • 打赏
  • 举报
回复
...

DECLARE @COUNT VARCHAR(50)
select @COUNT = count(*) from 主 where 查询条件
if(@COUNT >0 )
begion
select * from 主 where 查询条件
select * from 子 where 查询条件
end

这样不就可以吗?
也还有其他别的办法!你可以在想想!
happymugua 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hecong875 的回复:]
引用 5 楼 happymugua 的回复:
我查MSDN上就是这种做法,只是这种方法在没有查询条件的时候是正确的,有查询条件了就出错了。
还有没有别的什么解决方法?
难道只能点一下主表记录取它的ID在去从表查询数据再绑定么?

为什么有条件的时候就出错了呢?
[/Quote]
有查询条件时主表返回值就有可能为空,这时从表有数据,DataRelation这种关系就破坏了。因此就会出现
“不能启用此约束,因为不是所有的值都具有相应的父值”这中错误!
hecong875 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 happymugua 的回复:]
我查MSDN上就是这种做法,只是这种方法在没有查询条件的时候是正确的,有查询条件了就出错了。
还有没有别的什么解决方法?
难道只能点一下主表记录取它的ID在去从表查询数据再绑定么?
[/Quote]
为什么有条件的时候就出错了呢?
happymugua 2009-03-30
  • 打赏
  • 举报
回复
我查MSDN上就是这种做法,只是这种方法在没有查询条件的时候是正确的,有查询条件了就出错了。
还有没有别的什么解决方法?
难道只能点一下主表记录取它的ID在去从表查询数据再绑定么?
happymugua 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hecong875 的回复:]
你可以这样写!

select * from 主表
select * from 子表
同一个SQL语句里面! 然后返回dataset 数据的时候! ds.tables[0]主表 ds.tables[1]子表...
[/Quote]
主表需要根据查询条件筛选数据,有可能为空,当为空的时候这种DataRelation好像就破坏了!
happymugua 2009-03-30
  • 打赏
  • 举报
回复
你是说这样吗?

DataRelation relation = new DataRelation ("EmployeesInfo" , ds.Tables [ "dsTable" ].Columns [ "LoanBh" ] , ds.Tables [ "dsTable1" ].Columns [ "LoanBh" ] );
ds.Relations.Add (relation);
hecong875 2009-03-30
  • 打赏
  • 举报
回复
你可以这样写!

select * from 主表
select * from 子表
同一个SQL语句里面! 然后返回dataset 数据的时候! ds.tables[0]主表 ds.tables[1]子表...
Dobzhansky 2009-03-30
  • 打赏
  • 举报
回复
两个表设定主外键, 在 DataSet 内为两个表建立一个 DataRelation,

从表对应的 DataGridView 绑定那个 DataRelation, 就好了

查下 DataRelation 的文档就会了

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧