我有一个包含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?答案 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)会对性能产生影响。