2013-04-23 4 views
2

У меня есть winform, показывающий элемент управления Treeview, который заполняется целым куском узлов всякий раз, когда открывается winform. Мой код позволяет пользователю выбрать узел, затем открыть небольшой диалог, ввести значение, которое затем редактирует текст узла.Проверьте Treeview на предмет изменений?

Можно ли просмотреть все древовидное изображение для изменений, когда пользователь закрывает форму?

Я думал только о суммировании всех узлов в одну строку, а затем при закрытии формы суммировать ее снова как новую строку и сравнить ее с ранее созданной строкой, но я думаю, что есть лучшие способы сделай это.

ответ

0

Короткий ответ: Да, это возможно.

Если вы настаиваете на том, чтобы ждать с сохранением или регистрацией изменений до закрытия приложения, вы можете написать простую рекурсивную функцию для перемещения текущей версии (рабочей памяти с возможными изменениями) со старой версией (загруженной из того места, где у вас есть это сохранены). Я оставляю вам реализацию. В любом случае здесь некоторое вдохновение:

http://en.wikipedia.org/wiki/Tree_traversal

Лично идентификатор следует сохранить изменения, сделанные пользователем, когда форма редактирования закрывается нажатием ОК или сохранить.

0

Хотя вы можете проверить TreeView на все изменения, если вы привязали узлы вверх, я думаю, что правильный подход - управлять изменениями по мере их возникновения. Например, при открытии формы, которая редактирует узлы проходят в форме, откуда вы пришли, как это:

private Form1 _f; 

... 

public Form2(Form1 f) 
{ 
    this._f = f; 
} 

, а затем overrideOnClosing метод Form2 так:

protected override void OnClosing(CancelEventArgs e) 
{ 
    this._f.SetChangedNode(...); 
} 

и создать SetChangedNode метод на Form1. Я не знаю, как выглядят эти параметры, но они, вероятно, что-то вроде TreeNode node, string newLabel, а затем вы можете легко сохранить эти значения в Dictionary<TreeNode, string>, а затем использовать это Dictionary при закрытии приложения.

2

Это довольно распространенная ошибка, TreeView (например, ListBox и ListView) не имеет события, которое уведомляет об изменении коллекции узлов. Для этого есть веская причина, пользователь сам не может ничего сделать, чтобы добавлять или удалять узлы. Только ваш код может это сделать. И вы никак не можете знать об этом. Или, говоря иначе, вам не нужно получать уведомления о том, что вы уже знаете.

Если вы хотите, чтобы у вас было событие, вы можете добавить свой собственный. И запустите его, когда ваш код изменит коллекцию узлов. Обратите внимание, что это запах кода, вы почти всегда хотите, чтобы это вид уведомления на вашей модели вместо представления.

+0

'вам не нужно получать уведомления о чем-то, что вы уже знаете, - оставьте это заявление! –

Смежные вопросы