1

我有一个带有 3 个数据表的数据集:

个人

dt工资

朋友

每个人都有薪水,每个人都有一个朋友。

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

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

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

dtSalary.Add(dcHisFriend);

dcHisFriend.Expression = "Max(Parent.Child(Persons_Friend).NAME)";

但这显然是行不通的。

你能告诉我如何将一个有薪水的人的朋友的名字输入dcHisFriend列到薪水表中吗?

4

2 回答 2

1

我认为,无法访问 DataColumn 中“表达式”中的任何其他行。

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

于 2009-02-26T13:03:01.670 回答
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);

不过,有几点需要注意:首先,当我第一次尝试这个时,我遇到了语法错误,而表达式中的关系名称周围没有方括号。不过,这可能与我用于关系的名称有关。

其次,我相信 Expressions 的结果是针对行存储的(它们不是在访问时“及时”计算的,它们是在值更改时计算的,并保留结果)。这意味着您使用这种方法存储了两次数据。有时这很好,有时则不然。

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

于 2018-03-25T13:28:38.597 回答