Възстановяванеразширени редове на ValueTree след актуализирането му (управляван формуляр)

Като за начало бяха преровени доста форуми. В по-голямата си част те предложиха съхраняване на състоянието в допълнителна колона. Но моето дърво има над 400 000 записа и това е допълнителен разход на памет. Затова тръгнах в другата посока.

Анализът на проблема доведе до следните изводи:

  • трябва да съхраните списък само с разширени редове на дървото;
  • ако низът се свие, вече не е необходимо да се съхранява в списъка;
  • списъкът с разширени низове на дърво се съхранява на клиента, обикновено е много малък спрямо цялото дърво;
  • ако има избран ред, изберете го отново след актуализиране на дървото;
  • тъй като идентификаторите във FormDataTree се променят след актуализиране на дървото, трябва да контролираме това.

За клиентската страна е въведена променлива от типа Match. Той ще съхранява за разширените редове техните уникални стойности (като ключ) и идентификатори на редове (като стойности). Важното е, чене може да използва идентификатори на низове като ключове. Както писах по-горе, те се променят от системата, когато дървото се актуализира и е невъзможно да се повлияе на това.

Таблицата с управляван формуляр, свързана с ValueTree, има две събития, BeforeExpand() и BeforeCollapse(). Ние поставяме алгоритми за добавяне/изтриване на данни в разгънатия/свит ред на дървото в тези събития.

Когато формулярът се отвори, дървото се попълва автоматично в събитието OnCreateOnServer() и е в свито състояние.

Потребителят може самостоятелно да актуализира данните, например чрез натискане на бутон. Нека опишем софтуерната актуализация на дървото от страна на клиента.

Ние актуализираме данните за дървото на сървъра.

Ще опиша накратко какво се случва. Чрез заявка формираме йерархията на Номенклатурния справочник и изграждаме дърво.За да изключим повторното добавяне на вече съществуващи елементи към дървото, ние прекъснахме използването на съответствието на номенклатурата и низовете на дървото. Освен това по пътя, от тази кореспонденция, получаваме родителския низ на дървото за новия елемент.

След като дървото е изградено, ние формираме таблица с разширен ред данни. Тази част е от значение за възстановяването на дървото. При първата компилация се пропуска, защото нямаме разгърнати възли.

Когато таблицата е създадена, ние презареждаме дървото в атрибута на формуляра ValueTree. След това, използвайки метода UpdateTreeRowIdentifierTableOnServer(), преглеждаме данните от атрибута ValueTree (той има тип TreeFormData) и търсим номенклатурата от дървото в таблицата UnfoldedTreeRowsTable. Ако има съвпадения, ние променяме идентификаторите в редовете на ExpandedTreeRowsTable. Ако потребителят е избрал ред, ние също търсим нов идентификатор за този ред и го запомняме. Методът UpdateTreeRowIdTableOnServer() има ограничение, което се задейства, ако идентификаторите на всички разширени редове се актуализират.

След това контролът се връща към процедурата UpdateValueTreeOnServer(), където клиентската променлива на съвпадащите идентификатори на дървовидни редове се актуализира с действителните данни. На клиента дървовидните редове се разширяват според данните за съвпадение, редът се разпределя и актуализацията на дървото е завършена.

Самият алгоритъм е доста прост, въпреки доста голямото количество код. Можете да го използвате във всяко дърво. Достатъчно е да дефинирате уникална стойност за всеки ред от дървото.

Кодът също е бърз. По-специално, чрез уеб клиент на компютър със средна производителност, дърво от 400 хиляди реда се изгражда за около 2 минути, възстановява се за 40 секунди.