两个datagridview 分别显示主表和明细表的数据,该怎么做 两个datagridview--dgv1,dgv2 分别显示主表和明细表的数据,该怎么做dgv1绑定到表T1,有关键字段F1,dgv2绑定到表T2,通过字段F2与表T1的F1关联。当点击dgv1的某行时,dgv2显示表T2中字段f2等于表T1的F1字段的数据,具体该怎么做?是不是需要在数据集中添加关系啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不需要。写dgv1的行改变事件即可 对于不需要在明细报表中进行添加操作的情况下可以这样做,但是如果想在明细报表中利用datagridview的添加、修改、删除等功能,还是添加关系方便些。这里就不讨论用dgv1的行改变事件的方法了 通过事件处理GridView点击事件后,取出主表信息,根据主表信息查询数据绑定字表的GridView 不错。DataRelation relation = new DataRelation("关系名", dataset.Tables["主表"].Columns["F1"], dataset.Tables["明细表"].Columns["F2"]); dataset.Relations.Add(relation); 这里有个详细的例子:http://technet.microsoft.com/zh-cn/magazine/y8c0cxey(VS.85).aspx 与一般表不同的是,主要要解决删除主表记录时,子表相关记录应如何处理的问题除了关系外,再添加外键约束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方法 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; 如果是仅是明细表更改了,是不是也得执行dataset的update才能完成数据的入库操作? 原理上是不用。因为ForeignKeyConstraint只涉及主表更改后,子表应该怎么样。其实也没什么关系,如果主表没做更改,Update整个DataSet也不会有太多额外开销我上面的“constraint.DeleteRule = Rule.SetNull; //删除主表记录时,同时删除子表相关记录”错了,删除的话,应该是Rule.Cascade 主从表各有一个dataAdapter,是不是调用主表的dataAdapter就能同时更新明细表的内容了? 不是的。如果数据库内部没有再定义这样的外键约束的话,就像普通表一样,为各自的dataAdapter调用Update就可以了。而有时侯为了确保这种外键关系,会在数据库内部也定义同样的外键约束,这时侯提交应使用TableAdapterManager仅含一个关系时,它类似于这样的提交机制:子表TableAdapter.Update(子表.GetChanges(DataRowState.Deleted)); 主表TableAdapter.Update(主表); 子表TableAdapter.Update(子表.GetChanges(DataRowState.Modified)); 子表TableAdapter.Update(子表.GetChanges(DataRowState.Added)); 数据库内没定义外键约束啊,然后分别调用Update,出错: Update 无法找到 TableMapping['Table'] 或 DataTable“Table”。 你可以单独Update(主表),Update(子表) 主表的主键是自增的,通过在主dgv的CellEndEdit事件中完成一次主表的update,但是好像还是有问题,如在删除主记录然后保存时出现错误:违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条这种方式不太可靠啊 数据库中主表主键是自动编号的吗?另外检查一下有没有只提交,而没AcceptChanges,或只AcceptChanges而没提交的情况。这种方法就是为了保证数据关联的手段,本质就是额外的检查和操作,没什么不可靠的说法。而抛出异常,恰恰是检查机制起了作用,而lz的错误也未必全是它引起的啊如果使用向导进行数据绑定和关系及约束的添加应该就会感觉容易的多。 C#的主从表操作比Delphi要麻烦不少. 使用ManualResetEvent时,偶尔SET后方法没有被激活 如何在wpf中加载mfc dll库 急急急急!!!c# 模拟网站输入用户、密码、验证码登录,有偿服务! msdn上看到一个静态例子很困惑~~ 急急急!!!winform 二进制转换成PDF文件并显示 求C#中读取sql数据库中存储类型是Image的图片方法,要求返回也为Image的数据类型 c# 求一个正则表达式 关于金额数字格式的问题 return出错。 求透明图层的解决方案 30agian! 正则式重复匹配的问题 Windows 2008 无法使用OleDB方式访问oracle问题 c# 安装程序制作
对于不需要在明细报表中进行添加操作的情况下可以这样做,但是如果想在明细报表中利用datagridview的添加、修改、删除等功能,还是添加关系方便些。
这里就不讨论用dgv1的行改变事件的方法了
GridView点击事件后,取出主表信息,根据主表信息查询数据绑定字表的GridView
DataRelation relation = new DataRelation("关系名",
dataset.Tables["主表"].Columns["F1"],
dataset.Tables["明细表"].Columns["F2"]);
dataset.Relations.Add(relation);
http://technet.microsoft.com/zh-cn/magazine/y8c0cxey(VS.85).aspx
除了关系外,再添加外键约束
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方法
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;
如果是仅是明细表更改了,是不是也得执行dataset的update才能完成数据的入库操作?
其实也没什么关系,如果主表没做更改,Update整个DataSet也不会有太多额外开销我上面的“constraint.DeleteRule = Rule.SetNull; //删除主表记录时,同时删除子表相关记录”
错了,删除的话,应该是Rule.Cascade
如果数据库内部没有再定义这样的外键约束的话,就像普通表一样,为各自的dataAdapter调用Update就可以了。
而有时侯为了确保这种外键关系,会在数据库内部也定义同样的外键约束,这时侯提交应使用TableAdapterManager
仅含一个关系时,它类似于这样的提交机制:
子表TableAdapter.Update(子表.GetChanges(DataRowState.Deleted));
主表TableAdapter.Update(主表);
子表TableAdapter.Update(子表.GetChanges(DataRowState.Modified));
子表TableAdapter.Update(子表.GetChanges(DataRowState.Added));
Update 无法找到 TableMapping['Table'] 或 DataTable“Table”。
主表的主键是自增的,通过在主dgv的CellEndEdit事件中完成一次主表的update,但是好像还是有问题,如在删除主记录然后保存时出现错误:
违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条这种方式不太可靠啊