1

「mainForm」と「addRslt」という名前の 2 つのフォームがあります。アイデアは、ユーザーが mainForm のボタンをクリックすると、addRslt フォームが Show() になり、ユーザーが TreeView に入力するというものです。ユーザーがこのaddRsltフォームを閉じたい場合、プログラムは代わりにフォームをHide() ( e.Cancel = true;を使用) するため、後でユーザーがこれを再度開くと、TreeView にさらに項目を追加できます。

私のmainFormには、このaddRsltフォームを表示するためのボタンがあり、このボタンのクリックコード内にも、addRsltフォームのTreeViewのコンテンツを検出してmainFormのTreeViewにコピーするFormClosingデリゲートがあります。

問題は、重複したノードをチェックし、それらを mainForm の TreeView に追加しないことです。これは正しく行われていますが、プログラムが既存のノードを追加していないことをユーザーに知らせるメッセージ ボックスもあります。それは今まで大丈夫です..しかし、問題は私がこれを行うたびに、このメッセージボックスがN + 1回表示されることです! つまり、初めてやると、このメッセージボックスが2回表示されます...

これが私のコードです!話が長くなってすみません!

    private void menuFileAddTestResults_Click(object sender, EventArgs e)
    {
        addRslt.Show();

        addRslt.FormClosing += delegate
        {
            foreach (TreeNode node in addRslt.treeViewSelectedFiles.Nodes)
            {
                TreeNode newNode = new TreeNode();
                newNode.Text = node.Text;
                newNode.Name = node.Name;
                newNode.Tag = node.Tag;

                if (!treeViewTestFiles.Nodes.ContainsKey(node.Name))
                {
                    treeViewTestFiles.Nodes.Add(newNode);
                }
                else
                {
                    countExist++;
                }
            }

            if (countExist > 0)
            {
                MessageBox.Show(countExist.ToString() + " Test files are already exist in the list!");
            }

            countExist = 0;
        };
    }
4

2 に答える 2

1

インライン実装をマルチキャスト デリゲートに繰り返し追加しているようです。

明らかに、これはあなたの意図ではありません。Jon Skeet が提案するようにデリゲートの 1 つのインスタンスをサブスクライブするか、毎回サブスクリプションを管理する必要があります。

于 2011-04-11T14:26:55.853 に答える
1

FormClosing表示するたびにハンドラーを追加しています。フォームの残りの部分を設定するときに、一度追加するだけです。(個人的には、おそらくこれを別のメソッドに分割したいと思います...ラムダ式の特に適切な使用法ではないと思います-それは、包含メソッド内で宣言された変数を参照しないかなり大きなコードの塊です、したがって、実際の利点はありません。)

于 2011-04-11T14:18:04.623 に答える