一連のレコードに対してさまざまなフィルター項目を表すツリービューがあります。実行時に、各ノードのタグを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");
等..
次に、ユーザーがノードをクリックすると、タグを渡して、データを取得するための述語として使用します。
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);
}
問題は、動的に作成されたノードすべてに同じ述語オブジェクトが含まれていることです(これは、最後の前の反復中に作成された同じ述語のようです)。
ここで何が起こっているのかよくわかりません。何か案が?どうもありがとう!