我有一个树视图,它代表一组记录的不同过滤器项目。在运行时,我将每个节点的标签设置为 Func 类型。例如:
myTreeView.Nodes.Add(New TreeNode("Node1"));
myTreeView.Nodes["Node1"].Tag = New Func<MyRecordType, bool>(p=> p.Title == "test 1");
myTreeView.Nodes.Add(New TreeNode("Node2"));
myTreeView.Nodes["Node2"].Tag = New Func<MyRecordType, bool>(p=> p.Title == "test 2");
ETC..
然后当用户点击节点时,我只需传递标签并将其用作获取数据的谓词:
gridView.DataSource = populateData(nodeClicked.Tag as Func<MyRecordType, bool>);
private MyRecordType[] populateData(Func<MyRecordType, bool> predicate)
{
MyRecordType[] records;
if(predicate == null)
records = MyRecords.ToArray();
else
records = MyRecords.Where(predicate).ToArray();
return records;
}
这一切都很好,但我添加了一些基于一组记录创建节点的代码。它看起来像这样:
var users = DB.MyRecords.OrderBy(o=> o.CreatedBy).Select(s=> s.CreatedBy).Distinct();
foreach(var user in users) {
var node = new TreeNode("Node" + user, user);
node.Tag = new Func<MyRecordType, bool>(p=> p.CreatedBy == user);
MyTreeView.Nodes.Add(node);
}
问题是动态创建的节点都包含相同的谓词对象(这似乎是在最后一次 forsearch 迭代期间创建的相同谓词)。
我不太确定这里发生了什么。任何想法?太感谢了!