Snaží vložit/třídit seznam na základě "Objednávky" hodnota

0

Otázka

Vytvářím dokumentaci aplikace, ve které jsem, umožňuje lidem uvnitř mé podnikání pro přístup k dokumentaci o určitý software. S tímto, mám stránku, kde každý admin může spravovat kategorie a uživatele. Za to, chci admin, aby bylo možné změnit pořadí kategorie, ve které by měly být zobrazeny na můj NavigationMenu. Teď ta část, kde by to mělo správně pořadí kategorií na základě Objednávky uvnitř NavigationMenu funguje. Ale když se snažím upravit stávající kategorie a jejich pořadí čísel, objednávky nebude aktualizovat odpovídajícím způsobem, viz tento příklad:

To je před úpravou stávajících kategorií, tyto kategorie jsou čerstvě přidané/ New categories

Tohle je po úpravě kategorií, "Reagovat", by mělo být Pořadí 2, Kde API by být Cílem 0, a Test by bylo Pořadí 1 Edited categories

Jak můžete vidět, aby už nedává smysl. Samozřejmě, nemělo by být dovoleno více než 1 z jakékoliv objednávky.

Nyní, problém je s největší pravděpodobností pocházející z tohoto kodexu.

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;
        }

Pořadí kód vypadá takto:

CategoryDialog.břitva

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);
        }
    }

Výše uvedený kód je volána po stisknutí tlačítka. To prochází podél kategorie s určitým pořadovým číslem, toto číslo předává z jednoduchého rozbalovacího menu.

Na SaveCategory funkce vypadá takto:

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;
        }

Tato funkce volá problematické funkce, než ve skutečnosti ukládání/přidat něco do databáze. Takže to může trvat místo na nově přidané nebo upravené kategorie.

Po této Události dostane padáka oznámit můj NavigationMenu, že tam byly změny provedeny, a je třeba re-render na show. To nemá žádné problémy.

Ale nemůžu přijít na to, jak bych správně mít Objednávek být uvedeny, když jsem je změnit. Rychlé připomenutí, tato funkce nefunguje při editaci stávající kategorie. Pokud bych přidat novou kategorii, například v pořadí 2. To dělá správně posunout vše bez problému.

Jakákoliv pomoc je vítána!

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

Nejlepší odpověď

0

Takže pokud se uživatel pokusí provést druhý s pořadí 2, bude to sníží pořadové číslo jedna, který byl předtím?

Vaše logické smyčky nepodporuje, protože smyčky se zvyšuje, takže když se to stane, jste již prošel předchozí, takže budete mít dvojí 1 lze předpokládat, že po.

Myslím, že budete dostat tam, kam chcete, pokud vaše změnit nastavení smyčky spustit dolů jako tvůj tlačí dolů, i když samozřejmě budete mít na podporu, aby pod nulou brzy a že není vždy podporován

K:

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

Ale pro to, aby všechno dávalo smysl a není spuštěna v této navrhuji tlačí, aby se místo, protože pozitivní vysoká čísla nemají stejné problémy v rozích tak, aby se říci,

Nebo místo:

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

Nakonec také, pokud vaše realizace je jiná, než jsem si představte, budete chtít, aby skutečně přidat nové kategorie a ne všechny z nich (kromě thew new) znovu

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

Zkoušel jsem první 2 řešení, ale to vedlo v Pořadí, zbývající na 0 při vytváření nové kategorie. Nejsem si úplně jistý, co to poslední řešení. Ale pokud to pomáhá, "Kategorie" je seznam uvnitř CategoryService.cs To je jediný zdroj pravdy, když GetCategories volána, chytne nové info z databáze.
Rowin

@Rowin poslední předpokládá to, co chcete vložit v nové kategorii, a ne celý seznam Kategorií jsem neměl obsahovat nic o záchranu se změnilo, že? to není váš problém a vy už jste mistr. Tak protože jsem také předpokládám, že pořadí, ve své kategorii parametr je již správně nastavena vzhledem k tvé porovnání, aby to a nechceme vidět, jak je nastaven. Nastavil jsi to už před voláním SaveCategory pak? jak jsme ne manupulate parametr kategorie, ale jednoduše přidejte to, jak je to jen možné, je to vždy 0?
T. Nielsen

Hodnoty z Pořadí pochází z rozbalovací nabídka, ve které U můžete vybrat z 0 na aktuální množství kategorií, nebo při vytváření, 0 k současnému množství kategorií + 1. To byl předán k SaveCategory. To, co se snažím dělat, je vytvořit "Nový" seznam. Kde je vše posunul nahoru, aby se místo pro novou kategorii. Po kterém to je uložené a vlastně přidány do databáze. To funguje dobře při vytváření nové kategorie, ale při editaci stávajících dokumentů, to neznamená, posun se proto zůstat ve správném pořadí.
Rowin

V jiných jazycích

Tato stránka je v jiných jazycích

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