如何在DataColumn Expression中访问Parent Child

时间:2009-02-26 12:45:35

标签: c# ado.net expression datacolumn

我有一个包含3个DataTables的DataSet:

  

dtPerson

     

dtSalary

     

dtFriend

每个人都有工资,每个人都有一个朋友。

我在dtSalary中添加了一个列dcHisFriend,并希望显示拥有指定薪水的人的朋友姓名。

所以dtPerson有一个列NAME,dtSalary的列为VALUE,dtFriend的列为NAME。

我添加了列dcHisFriend并将Expression设置为:

  

dtSalary.Add(dcHisFriend);

     

dcHisFriend.Expression =   “最大(Parent.Child(Persons_Friend).NAME)”;

但这显然不起作用。

你可以告诉我怎么样 在薪水表中加入一个人的朋友的姓名dcHisFriend?

2 个答案:

答案 0 :(得分:1)

我认为,如何访问DataColumn中“Expression”中的任何其他行。

唯一的方法,如何实现类似的行为是挂钩DataTables上的DataColumnChanged事件,其中是源数据,然后将计算值设置为常规列(=没有表达式的列)。

答案 1 :(得分:0)

实际上有一种方法可以做到这一点,前提是你的表之间的关系是1比1(虽然缺少的行不是一个大问题):创建两个关系而不是一个,即

var joinColT1 = table1.Columns["ID"];
var joinColT2 = table2.Columns["FK_IDT1"];
var rel1 = new DataRelation("R1To2", joinColT1, joinColT2, false);
var rel2 = new DataRelation("R2To1", joinColT2, joinColT1, false);
theDataSet.Relations.Add(rel1);
theDataSet.Relations.Add(rel2);
// Add the column you're after
var hisFriend = new DataColumn("HisFriend", typeof(string), "Parent([R2To1]).[HisFriend]");
table1.Columns.Add(hisFriend);
// Add a back-reference to the other table against the friend if you want, too
var hisFriendsSalary = new DataColumn("HisFriendsSalary", typeof(decimal) "Parent([R1To2]).[Salary]");
table2.Columns.Add(hisFriendsSalary);

但是有几点注意事项:首先,当我第一次尝试这个时,我得到的语法错误没有表达式中关系名称的方括号。这可能与我用于关系的名字有关。

其次,我相信表达式的结果是针对行存储的(它们不是计算出来的#34;只是在时间上#34;在访问时,它们会在值发生变化时计算出来,结果被存管)。这意味着您使用此方法存储数据两次。有时候这很好,有时候也不是。

第三,你会注意到我没有使用约束。这是因为在我的典型用例中,我并不期望每一行在另一个表中都有一个模拟(这就是为什么首先有两个表,经常!) 。这可能(我没有检查过dotnetframework.org)会对性能产生影响。