Încercarea de a introduce/a sorta o listă bazată pe "Ordinul" valoare

0

Problema

Am creat o documentație aplicație în care permit ca persoane din interiorul meu de afaceri pentru a accesa documentația cu privire la anumite programe. Cu asta, am o pagină în cazul în care orice admin poate gestiona categorii și utilizatori. Pentru acest lucru, vreau admin pentru a fi capabil de a schimba ordinea de o categorie în care ar trebui să fie afișate pe NavigationMenu. Acum, partea în care ar trebui să în mod corespunzător pentru categoriile pe baza de Comanda in interiorul NavigationMenu funcționează. Dar când m-am încercați să editați categoriile existente și numere de ordine, ordinele nu se va actualiza în mod corespunzător, vezi acest exemplu:

Aceasta este înainte de editare categorii existente, aceste categorii sunt proaspăt adăugat/făcut New categories

Acest lucru este după editarea categorii, "Reacționează" ar trebui să fie de Ordinul 2, în cazul în Care API ar fi de Ordinul 0, și de Testare ar fi Scopul 1 Edited categories

După cum puteți vedea, ordinea nu mai are sens. Evident, nu ar fi permis mai mult de 1 din orice ordine.

Acum, problema este cel mai probabil vine de la acest cod.

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

Ordinea de cod merge ca aceasta:

CategoryDialog.aparat de ras

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

Codul de mai sus este numit după o apăsare de buton. Acesta trece de-a lungul o categorie cu un anumit număr de ordine, acest număr devine trecut de-a lungul de la un simplu meniu vertical.

La SaveCategory funcția arată astfel:

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

Această funcție solicită problematică funcția de fapt, înainte de salvarea/adăugând ceva la baza de date. Deci, aceasta poate avea loc pentru nou adăugate sau editate categorie.

După aceasta, un Eveniment este concediat de a notifica mea NavigationMenu că nu au fost modificări de făcut, și ar trebui să re-face să arate acest lucru. Acest lucru nu are probleme.

Dar nu-mi dau seama cum aș cum trebuie Ordinele fi listate atunci când am schimba-le. Memento rapid, această funcție nu funcționează atunci când editarea categoriilor existente. Dacă aș adăuga o nouă categorie, de exemplu, la ordinul 2. O face corect schimbul totul cu nici o problema.

Orice ajutor este binevenit!

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

Cel mai bun răspuns

0

Deci, dacă utilizatorul încearcă să facă un al doilea, cu spun ordinul 2, se va reduce numărul de ordine de la cel care a fost înainte?

Bucla logica nu are suport pentru asta, pentru că bucla este în creștere, astfel încât de data aceasta se întâmplă deja ai trecut anterioară, astfel încât veți obține un dublu 1 probabil, după.

Cred că vei ajunge acolo unde vrei, dacă-ți schimbi buclă pentru a rula în jos ca împingând în jos, deși, evident, va trebui pentru a sprijini ordinea de mai jos zero în curând și că nu este întotdeauna acceptată

A:

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

Dar pentru ca totul să aibă sens și nu se execută în acest sugerez împingând comanda în schimb, din cauza pozitiv numere mari nu au aceleași probleme în colțuri ca să spunem așa

Sau în loc:

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

În cele din urmă, de asemenea, cu excepția cazului în aplicare este diferit decât mi-am imaginat, veți dori să adăugați de fapt noua categorie și nu toate dintre ele (cu excepția thew nou) din nou

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

Am încercat primele 2 soluții, dar acest lucru a dus în Ordinea rămase de la 0 la crearea de noi categorii. Nu sunt foarte sigur ce ultima soluție nu-i. Dar dacă-l ajută "Categorii" este o listă în interiorul CategoryService.cs Aceasta este o singură sursă de adevăr, atunci când GetCategories este chemat, se apucă noi informatii din baza de date.
Rowin

@Îndreptăm ultima presupune ceea ce vrei pentru a introduce în noua categorie și nu întreaga listă Categorii nu includ nimic despre, de fapt, salvarea s-a schimbat, nu? acest lucru nu a fost problema si deja asta. Așa că eu presupun, de asemenea, ordinea în categoria parametru este deja setat corect din cauza ta față de ea și nu vedem cum este setat. Ți-ai stabilit-o deja înainte de a suna SaveCategory atunci? ca noi nu manupulate parametrul categorie, dar pur și simplu adăugați-l ca este singura posibilitate este că a fost întotdeauna 0?
T. Nielsen

Valoarea de Ordinul vine de la un meniu vertical, în care U poate selecta de la 0 la valoarea actuală de categorii, sau atunci când creați unul, de la 0 la valoarea actuală de categorii + 1. Este trecut de-a lungul a SaveCategory. Ceea ce încerc să fac acum, este de a crea un "Nou" listă. În cazul în care totul este deplasat în sus pentru a face loc pentru noua categorie. După care a fost salvat și, de fapt, adăugat la baza de date. Aceasta funcționează bine atunci când crearea de noi categorii, dar atunci când editarea documentelor existente aceasta să nu se schimbe în consecință să rămână în ordinea corectă.
Rowin

În alte limbi

Această pagină este în alte limbi

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