0

私のポイントは、StatusStripLabel にすべての子ノードの数を表示することです。私の要点は、子ノードの数が変更されるたびに StatusStripLabel が更新されるようにしたいということです-既に存在するもののいくつかを追加または削除します。まず、コードを に配置しましたPublic Formが、期待どおりに動作しませんでした。しばらくして、実際に機能するアイデアが浮かびました。ボタンメソッド内にコードを配置しました。しかしその後、ノードを削除する場合に備えて、2 番目に配置する必要があることに気付きました。だから私の質問は次のとおりです。それをより簡単にすることができるものはありますか? 私の説明が十分でない場合は、教えてください。最善を尽くします。

コードからPublic Form(ボタンを押した後ではなく、最初からカウンターを機能させたいため)

childNodeCounter();
toolStripStatusLabel1.Text = "Number of games in database: " + NodeCounter.ToString();

方法:

        public void childNodeCounter()
    {
        NodeCounter = 0;
        foreach (TreeNode RootNode in treeView1.Nodes)
        {

            foreach (TreeNode ChildNode in RootNode.Nodes)
            {
                NodeCounter++;
            }
        }
        toolStripStatusLabel1.Text = "Number of games in database: " + NodeCounter.ToString();

    }

ボタンメソッド内のコード:

    private void button1_Click(object sender, EventArgs e)
    {

        NodeCounter = 0;
        foreach (TreeNode RootNode in treeView1.Nodes)
        {

            foreach (TreeNode ChildNode in RootNode.Nodes)
            {
                NodeCounter++;
            }
        }
        toolStripStatusLabel1.Text = "Number of games in database: " + NodeCounter.ToString();
    }

編集:氏に感謝します。Hans Passant 私はこれを書きましたが、非常にうまく機能します。

        public int childNodeCounter(TreeNodeCollection nodes)
        {
        int count = 0;
        foreach (TreeNode RootNode in nodes)
        {
            foreach (TreeNode ChildNode in RootNode.Nodes)
                count++;
        }
        return count;

イベント ハンドラーは次のようになります。

toolStripStatusLabel1.Text = "Number of games in database: " + childNodeCounter(treeView1.Nodes);
4

3 に答える 3

1

3 つの小さな最適化

  1. ツリーを自分で反復するのではなく、使用するだけですChildNode.Nodes.GetNodeCount

  2. 同じロジックを別の場所で繰り返すのではなく、ボタンの Click イベントで単にUpdateNodeCount()メソッドを呼び出すようにします。

  3. 最初のコード フラグメントのテキスト初期化子は冗長であるため、削除できます。childNodeCounter の呼び出しによって、ステータス ラベルの更新が既に行われています。

于 2013-07-20T16:50:21.910 に答える
1

ツリー構造をトラバースする自然な方法は、再帰を使用することです。これを理解するのは常に少し難しいですが、利用可能なリソースはたくさんあります。繰り返し行うのはかなり醜いです。ネストされたノードから再びバックトラックできるようにするには、Stack<> を使用する必要があります。したがって、再帰ソリューションを投稿します。

    private static int CountNodes(TreeNodeCollection nodes) {
        int count = nodes.Count;
        foreach (TreeNode node in nodes) count += CountNodes(node.Nodes);
        return count;
    }

次に、イベント ハンドラーは次のようになります。

    private void button1_Click(object sender, EventArgs e) {
        toolStripStatusLabel1.Text = "Number of games in database: " +
            CountNodes(treeView1.Nodes);
    }
于 2013-07-20T16:55:45.497 に答える
0

「ゲーム」ノードをtreeViewに追加および削除する場合は、および(子)ノードを追加/削除するメソッドvoid AddGame(string title)void RemoveGame(string title)合計数を数えたいノード)が必要です。toolStripStatusLabel1.Textよく理解できれば、子ノードの数が変わるたびに自動で更新したい。その場合、フィールドを追加できます

private int nodesCount;

Form クラスに追加し、次のようなものを用意します。

void AddGame(string title)
{
    if(InvokeRequired)
    {
        Invoke(new MethodInvoker(delegate() { AddGame(title); }));
    }
    else
    {
        AddGameNodeToTreeView(title); // add new game node to desired place in TreeView
        nodesCount++; // increase node counter
        toolStripStatusLabel1.Text = "Number of games in database: " + nodesCount;
    }  
}

RemoveGame()同じ方法で実装されます (またはAddGame()、1 つの追加の引数を持つ単一のメソッドに結合されます - bool add)。複数のノードを追加/削除する場合、両方のメソッドを拡張できます。その場合、タイトル配列を渡し、nodesCountそれに応じて更新します。

このアプローチの利点は、更新する前に毎回ツリー内のノードをカウントする必要がないことですtoolStripStatusLabel1.Text。また、toolStripStatusLabel1.Textユーザーがボタンをクリックしたときだけでなく、自動的に更新されます。

欠点は、nodesCountやや冗長な情報であることです。関心のあるノードの総数は、treeView. nodesCount実際のノード数と同期していることを確認する必要があります。

于 2013-07-20T18:12:55.890 に答える