Проблема события FormClosing делегата - PullRequest
1 голос
/ 11 апреля 2011

У меня есть две формы с именами 'mainForm' и 'addRslt'. Идея состоит в том, что когда пользователи нажимают кнопку в mainForm, форма addRslt будет отображать Show (), а затем пользователь будет заполнять TreeView. Теперь, когда пользователь ХОЧЕТ ЗАКРЫТЬ эту форму addRslt, программа вместо этого будет Скрыть () форму (используя e.Cancel = true; ), так что позже, если пользователь снова откроет это он / она может добавить больше вещей в TreeView.

В моей mainForm у меня есть кнопка для отображения этой формы addRslt, а также внутри кода щелчка этой кнопки есть мой делегат FormClosing, который обнаружит и скопирует содержимое TreeView в форме addRslt в TreeView в mainForm.

Теперь проблема в том, что я хочу проверять дубликаты узлов и не добавлять их в TreeView в mainForm. Это сделано правильно, но у меня также есть окно сообщения, которое сообщает пользователю, что программа не добавила существующие узлы! это нормально до сих пор .. НО проблема с каждым разом, когда я это делаю, это сообщение появляется 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;
        };
    }

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Похоже, вы постоянно добавляете свою встроенную реализацию к делегату многоадресной рассылки.

Очевидно, что это не ваше намерение.Вам нужно будет либо подписать один экземпляр делегата, как предлагает Джон Скит, либо каждый раз управлять подписками.

1 голос
/ 11 апреля 2011

Вы добавляете обработчик FormClosing каждый раз, когда показываете его. Просто добавьте его один раз, когда вы настроите остальную часть формы. (Лично я, вероятно, разделил бы это на отдельный метод ... Я не думаю, что это особенно подходящее использование лямбда-выражения - это довольно большой кусок кода, который не ссылается ни на какие переменные, объявленные в содержащем метод так что реальной выгоды нет.)

...