4

TreeViewWinFormアプリケーションがあり、メソッドとメソッドを使用して、新しいaddノードを追加したり、既存のノードを並べ替えたり、古いメモを削除したりしています。reorderdelete

新しいアイテムを追加すると、すぐにネット表示されるTreeViewことがありますが、次のノードを追加すると正しく表示されます。ランダムに発生しているようですので、根本的な原因を突き止めるのは難しいです。

UIにノードが正しく表示されない場合でも、ノード数は正しいです。

TreeView1.BeginUpdate();
TreeView1.Nodes.Add("P1", "Parent");

foreach(User u in items)
{
    if( condition)
    {
        node.Text =u.sNodeText; 
        node.Tag = u;
        node.Text = u.sNodeText;                    
        GetChildren(node);
        TreeView1.Nodes["P1"].Nodes.Add((TreeNode)node.Clone());
    }
}            
TreeView1.ExpandAll();
TreeView1.EndUpdate();           
TreeView1.Refresh(); 

誰かがこの質問に答えることができますか?質問は無意味ではないと思います。これがGetChildrenメソッドです。

     private void GetChildren(TreeNode node)
    {
        TreeNode Node = null;
        User nodeCat = (User)node.Tag;

        foreach (User  cat in items)
        {
            if (cat.sParentID == nodeCat.sID)
            {
                Node = node.Nodes.Add(cat.sNodeText);
                Node.Tag = cat;
                GetChildren(Node);
            }
        }
4

4 に答える 4

3

Invalidate()対を試しましたRefresh()か? Refresh はクライアント領域のみを再描画しますが、Invalidate はコントロール全体を再描画します。それは暗闇の中でのショットです... 私は前にこの問題に遭遇したことはありません.

于 2012-07-12T05:22:21.037 に答える
1

これは、浅いコピーを生成する Clone の使用に関連している可能性があると思います。Add メソッドの使用によりノード数が更新されますが、「新しい」ノードには作成元のノードからの参照が残っているため、一意のオブジェクトではありません。代わりにディープ コピーを作成してみて、どうなるか見てみましょう。

例えば:

public TreeNode DeepNodeClone(TreeNode src)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, src);
ms.Position = 0;
object obj = bf.Deserialize(ms);
ms.Close();
return (TreeNode)obj;
}

次に、このノードを子として目的の親ノードに追加します。

于 2012-07-17T03:51:13.040 に答える
1

まず、GetChildren メソッドを呼び出した後、なぜノードをツリーに追加するのでしょうか? 親IDが空(またはタイプに応じてnullまたは0)の場合にのみ、ツリーに追加する必要があります。さらに、EnsureVisible新しく追加したノードにメソッドを追加し、クローニングを削除します。

...
    if (u.sParentID==null)
    {
    TreeView1.Nodes["P1"].Nodes.Add(node); 
    node.EnsureVisible();
    }
...

お役に立てれば

于 2012-07-12T15:15:57.213 に答える
1

私が間違っていなければ、

TreeView1.BeginUpdate() method that you could use and at the end utilize the 
TreeView1.EndUpdate();
于 2012-07-12T20:29:56.633 に答える