ID、Name、ParentIDの3つの列を持つテーブルがあります。ID列には、主キーとしても機能する実行番号が含まれています。IDは、ノードのNameプロパティにもなります。Name列には、treenodeのText属性となる文字列が含まれ、ParentIDは、ノードの親IDを含む列です。
これは私のテーブルがどのように見えるかです:
ID Name ParentID
======================
1 A 0
2 A1 1
3 B 0
4 C 0
5 A2 1
6 B1 3
この表は、ノードAがノードA1およびA2の親ノードであることを示しています。ParentIDが「0」に等しい場合は、ノードの親がルートノード(ハードコードされている)であることを意味します。たとえば、ノードA、B、およびCはルートノードの子です。
ツリービューにデータを入力する前に、ParentIDで行を並べ替えます。次の2つの方法を使用してツリービューにデータを入力します(ここでのTreeNodeノードは、ツリーに入力されている子ノードです)。
private void SearchParent(TreeView tree, String parentID, TreeNode node)
{
// Post: call TraverseParent method to search parent
TreeNodeCollection collection = tree.Nodes;
// Search parent recursively
foreach (TreeNode n in collection)
{
TraverseParent(n, parentID, node);
}
}
private void TraverseParent(TreeNode potentialParent, String parentID, TreeNode node)
{
// Post: search for parent. When parent is found add child to parent
// am i the parent that you're looking for?
if (parentID.CompareTo(potentialParent.Name) == 0)
{
// found me! i'm your parent!
// add child to parent
potentialParent.Nodes.Add(node);
// update that the parent for child has been found
parentFound = true;
}
else
{
// i'm not your parent
// continue to look for parent recursively
foreach (TreeNode n in potentialParent.Nodes)
{
TraverseParent(n, parentID, node);
}
}
}
ノードAをノードCの子にして、ノードをドラッグアンドドロップし、データベースに変更をコミットするまでは、すべて問題ありません。
これで、データベーステーブルは次のようになります。
ID Name ParentID
======================
1 A 4
2 A1 1
3 B 0
4 C 0
5 A2 1
6 B1 3
次にアプリケーションを実行すると、親が見つからなかったため、ノードA1とA2をツリーに取り込むことができません。これは、ツリービューにデータを入力する前にParentIDに基づいて行を並べ替えると、行が次のように並べ替えられるためです。
ID Name ParentID
======================
3 B 0
4 C 0
2 A1 1
5 A2 1
6 B1 3
1 A 4
このように、私のアプリケーションは、ノードAが作成される前であっても、A1ノードとA2ノードをツリーに追加しようとします。したがって、アプリケーションはノードA1およびA2の親を見つけることができませんでした。
したがって、誰かがこのバグを修正する方法を教えてもらえますか、それともツリービューに動的にデータを入力するためのより良い方法がありますか?
ありがとう。