C cli Сортиране ListBox

Има xml файл, всеки възел има 2 атрибута, да кажем име и номер, искам да направя ListBox, сортиран по един от атрибутите, xml за яснота:

Мога да сортирам ListBox по азбучен ред, но трябва да го сортирам при щракване върху бутон по един от атрибутите. Сега исках да формирам списък от този xml и вече да го сортирам, но нещо за C ++ / CLI примери не е достатъчно, но някак си не работи за превод от C #. Ще добавя и C# тага, тъй като обикновено нямам проблеми с превода към CLI и има повече хора там.

Най-лесният начин е да преминете към C#. Готов съм да се обзаложа, че имате най-много няколкостотин реда код. Можете да ги пренапишете за максимум няколко дни, след което животът ще стане лесен и приятен.

След това обаче ще бъдете посъветвани да преминете от WinForms към WPF. След това към .NET Core (между платформи!) и т.н.

Също така съм сигурен, че това е учебна задача. Следователно няма измъкване от C++/CLI. Е, да тръгваме!

Всяко име на елемент може да се използва в xml с едно изключение: коренният таг не може да се нарича xml. Така че ще трябва да се преименува. Например, нека го наречем възли.

В съвременната разработка на софтуер най-правилният подход е да се създаде модел за всеки използван обект. Така че нека създадем клас възел:

Заменете пространството от имена с вашето собствено.

Моля, обърнете внимание, че имената на класа и свойствата са същите като имената на xml таговете. Свойствата и класът са обявени за публични - това е необходимо, за да може десериализаторът да ги види.

Класът също има метод Sort (мисля, че целта е ясна) и Comparison , който е необходим за преминаване към метода за сортиране на колекцията.

Има и typedef, също необходим за използване в сериализатора.

Включваме този файл във файлаформи с #include.

В класа на формуляра декларираме поле - това е колекция, която ще съхранява списък с нашите класове:

Може също да се декларира като List ^ възли; , но след като вече имаме typedef, защо да не го използваме.

Нека създадем друго поле. Това е клас, който автоматично (де)сериализира данни към/от xml. Именно за него са необходими публични имоти и съвпадение на имена.

В конструктора трябва да подадете типа на класа, с който ще работи. Не можете да пишете List ^::typeid. Ето защо се използва typedef.

На мястото, където трябва да прочетете данните от xml файла и да го поставите в ListBox, пишем следния код:

Отваряме потока. Сериализаторът чете данните и попълва колекцията с данни - един ред код! Удобно, нали? Затваряме потока.

Остава да направим сортирането. Просто е:

Колекцията List има метод Sort и ние го използваме. Ние предаваме нашето сравнение в него. След това правим повторно свързване на данни.