Próba wstaw/sortować listę na podstawie wartości "Porządek"

0

Pytanie

Tworzę aplikację do dokumentacji, w którym uczestniczę ludziom w moim biznesie dostęp do dokumentacji określonego oprogramowania. Dzięki temu mam strona, na której każdy administrator może zarządzać kategoriami i użytkownikami. Do tego chcę, aby administrator mógł zmienić kolejność kategorii, w której powinna pojawić się w moim menu nawigacji. Teraz działa ta część, gdzie powinien prawidłowo organizować kategorii na podstawie kolejności wewnątrz menu nawigacji. Ale gdy próbuję edytować istniejące kategorie i ich numery zamówień, zamówienia nie są aktualizowane odpowiednio, patrz przykład Ten:

Odbywa się to przed edycją istniejących kategorii ostatnio dodane/wykonane New categories

To po edycji kategorii "Reagować" powinno być rzędu 2, gdzie API będzie porządek 0, a test będzie kolejność 1 Edited categories

Jak widać, rozkaz więcej nie ma sensu. Oczywiście, że nie powinno być dozwolone ponad 1 każdego zamówienia.

Teraz problem jest najprawdopodobniej związany z tym kodem.

CategoryService.cs

public async Task<List<Category>> InsertCategory(Category category)
        {
            await GetCategories();
            for (int i = 0; i < Categories.Where(c => c.Order >= category.Order).Count(); i++)
            {
                Categories[i].Order++;

                if (Categories[i].Order == category.Order)
                {
                    Categories[i].Order--;
                    break;
                }
            }

            await categoryRepository.InsertAsync(Categories);
            EventHelper.NotifyCategoryListChanged(Categories, EventArgs.Empty);
            return Categories;
        }

Kolejność kodu wygląda następująco:

Katalog kategorii.brzytwa

private async void SaveCategory(Category category)
    {
        if(!string.IsNullOrEmpty(category.Name))
        {
            await categoryService.SaveCategory(category);
            Snackbar.Add("Category " + category.Name + " added", Severity.Success);
            MudDialog.Close(DialogResult.Ok(category.Id));       
        }
        else
        {
            Snackbar.Add("Please enter a category name.", Severity.Warning);
        }
    }

Powyższy kod jest wywoływany po naciśnięciu przycisku. To przekazuje kategorię z określonym numerem zamówienia, numer ten jest przekazywany z prostego menu rozwijanego.

To SaveCategory funkcja wygląda tak:

CategorySerice.cs

public async Task<Category> SaveCategory(Category category)
        {
            await InsertCategory(category);

            if (categoryRepository.GetByIdAsync(category.Id) == null)
            {
                await categoryRepository.AddAsync(category);
            }
            else
            {
                await categoryRepository.SaveAsync(category);
            }

            EventHelper.NotifyCategoryListChanged(Categories, EventArgs.Empty);

            return category;
        }

Funkcja ta powoduje niewłaściwą funkcji przed faktycznym zachowaniem/dodanie czegoś do bazy danych. W ten sposób, to może się zdarzyć dla nowo dodanej lub edytowanej kategorii.

Po tym uruchamia zdarzenie, informujący moje menu nawigacji o tym, że zostały wprowadzone zmiany, i musi ponownie wyświetlane, aby pokazać to. W tym nie ma żadnych problemów.

Ale nie mogę zrozumieć, jak prawidłowo wskaże Zamówienia, gdy ja je zmienię. Szybkie przypomnienie, ta funkcja nie działa podczas edytowania istniejących kategorii. Gdyby dodałem nową kategorię, na przykład, przy zamówieniu 2. On poprawnie przenosi wszystko bez problemów.

Każda pomoc jest mile widziane!

.net c# entity-framework
2021-11-23 11:52:48
1

Najlepsza odpowiedź

0

Tak więc, jeśli użytkownik spróbuje zrobić drugie zamówienie, powiedzmy, z zamówieniem 2, to zmniejszy numer zamówienia w porównaniu z poprzednim?

Twoja logika cyklu tego nie obsługuje, bo twój cykl podwyżek, więc do tego czasu, kiedy to się stanie, już minął poprzedni, tak, że, prawdopodobnie, po tym dostaniesz podwójny 1.

Myślę, że można osiągnąć to, czego chcesz, jeśli zmień swój cykl na ruch w dół, jak po naciśnięciu w dół, choć, oczywiście, wkrótce będzie musiał utrzymać porządek poniżej zera, a to nie zawsze jest obsługiwany

Dla:

for (int i = Categories.Count() -1; i >-1; i--)
{
    if (Categories[i].Order <= category.Order)
    {
        Categories[i].Order = Categories[i].Order--;
    }
}

Ale do tego, żeby wszystko miało sens i nie впадало w to proponuję zamiast tego zwiększyć zamówienie, bo pozytywnych wysokich liczb, że tak powiem, nie ma takich problemów w rogach

Lub zamiast tego:

for (int i = 0; i < Categories.Count(); i++)
{
    if(Categories[i].Order < category.Order) continue;
    Categories[i].Order = Categories[i].Order++;
}

Ostatecznie, również, jeśli twoja realizacja nie różni się od tego, że ja sobie wyobrażam, chcesz faktycznie dodać nową kategorię, a nie wszystkie z nich (z wyjątkiem nowej) ponownie

--FROM: await categoryRepository.InsertAsync(Categories);
--TO:
await categoryRepository.InsertAsync(category);
2021-11-23 12:22:15

Próbowałem pierwsze 2 rozwiązania, ale to doprowadziło do tego, że przy tworzeniu nowych kategorii kolejność pozostał równy 0. Nie jestem do końca pewien, co sprawia, że ostatnia decyzja. Ale jeśli to pomoże, "Kategorii" - to lista wewnątrz CategoryService.cs To jedyne źródło prawdy, gdy GetCategories dostaje wyzwanie, otrzymuje nowe informacje z bazy danych.
Rowin

@Rowin ostatnia zakłada, że chcesz włożyć w nową kategorię, a nie pełna lista kategorii, w której nic się nie załączył o rzeczywistym zachowaniu, prawda? nie była to twój problem, i już opanowali tym. Dlatego zakładam również, że porządek w swoim parametrze kategorii jest już zainstalowany poprawnie z powodu twojego porównania z nim, i nie widzimy, jak on zainstalowany. Ty już masz go przed wywołaniem kategorii zapisać? ponieważ my nie wprowadzamy kategorię ustawień ręcznie, a po prostu dodajemy go tak jak jest, jedyna możliwość to zawsze było 0?
T. Nielsen

Wartość zamówienia jest wydalany z rozwijanego menu, w którym można wybrać od 0 do aktualnej ilości kategorii lub przy tworzeniu jednej z nich od 0 do aktualnej ilości kategorii + 1. To jest przekazywane w kategorii zachowania. To, co staram się zrobić, to stworzyć "Nowy" lista. Gdzie wszystko przesuwa się w górę, aby zrobić miejsce dla nowej kategorii. Po czym zostanie on zapisany i faktycznie jest dodawany do bazy danych. To doskonale współpracuje przy tworzeniu nowych kategorii, ale podczas edycji istniejących dokumentów to nie zmienia się odpowiednio, aby pozostać w dobrej kolejności.
Rowin

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................