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 и ние го използваме. Ние предаваме нашето сравнение в него. След това правим повторно свързване на данни.