'Sipariş' değerine göre bir liste eklemeye / sıralamaya çalışıyorum

0

Soru

İşletmemdeki kişilerin belirli yazılımlarla ilgili belgelere erişmesine izin verdiğim bir dokümantasyon uygulaması oluşturuyorum. Bununla, herhangi bir yöneticinin kategorileri ve kullanıcıları yönetebileceği bir sayfam var. Bunun için yöneticinin Gezinme menümde görüntülenmesi gereken bir kategorinin sırasını değiştirebilmesini istiyorum. Şimdi, NavigationMenu içindeki Siparişe göre kategorileri düzgün bir şekilde sipariş etmesi gereken kısım çalışıyor. Ancak mevcut kategorileri ve sipariş numaralarını düzenlemeye çalıştığımda siparişler buna göre güncellenmeyecek, bu örneğe bakın:

Bu, mevcut kategorileri düzenlemeden önce, bu kategoriler yeni eklenir / yapılır New categories

Bu, kategorileri düzenledikten sonra," React " Sipariş 2 olmalıdır, Burada API Sipariş 0 olur ve Test Sipariş 1 olur Edited categories

Gördüğünüz gibi, emir artık mantıklı değil. Açıkçası, herhangi bir siparişin 1'inden fazlasına izin verilmemelidir.

Şimdi, sorun büyük olasılıkla bu koddan geliyor.

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

Kodun sırası şöyle::

KategoriDialog.jilet

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

Yukarıdaki kod bir düğmeye basıldıktan sonra çağrılır. Bu, belirli bir sipariş numarasına sahip bir kategori boyunca geçer, bu sayı basit bir açılır menüden iletilir.

Bu SaveCategory işlev şöyle görünür:

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

Bu işlev, veritabanına herhangi bir şey kaydetmeden/eklemeden önce sorunlu işlevi çağırır. Böylece yeni eklenen veya düzenlenen kategori için gerçekleşebilir.

Bundan sonra, navigationmenu'ma değişiklikler yapıldığını bildirmek için bir Olay tetiklenir ve bunu göstermek için yeniden oluşturulmalıdır. Bu herhangi bir sorun vardır.

Ama değiştirdiğimde Emirlerin nasıl düzgün bir şekilde listelenmesini sağlayacağımı anlayamıyorum. Hızlı hatırlatma, mevcut kategorileri düzenlerken bu işlev çalışmaz. Örneğin 2. sırada yeni bir kategori eklersem. Düzgün hiçbir sorun shift her şeyi yapar.

Herhangi bir yardım açığız!

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

En iyi cevabı

0

Yani kullanıcı sipariş 2 ile bir saniye yapmaya çalışırsa, daha önce olanın sipariş numarasını azaltacak mı?

Döngü mantığınız bunu desteklemiyor, çünkü döngünüz artıyor, bu yüzden gerçekleştiğinde bir öncekini çoktan geçtiniz, böylece muhtemelen bir çift 1 elde edersiniz.

Döngünüzü aşağı doğru itmek gibi aşağı doğru koşmak için değiştirirseniz istediğiniz yere ulaşacağınızı düşünüyorum, ancak yakında sıfırın altındaki düzeni desteklemeniz gerekecek ve bu her zaman desteklenmiyor

-e doğru:

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

Fakat her şeyin mantıklı olması ve buna girmemesi için, bunun yerine siparişi yukarı itmenizi öneririm, çünkü pozitif yüksek sayılar köşelerde aynı problemlere sahip değildir

Veya bunun yerine:

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

Sonuçta, uygulamanız hayal ettiğimden farklı olmadığı sürece, aslında yeni kategoriyi eklemek isteyeceksiniz ve hepsini (yeni olanlar hariç) tekrar eklemek istemeyeceksiniz

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

İlk 2 çözümü denedim, ancak bu, yeni kategoriler oluştururken Siparişin 0'da kalmasına neden oldu. Son çözümün ne işe yaradığından emin değilim. Ama eğer yardımcı olursa "Kategoriler" içinde bir listedir CategoryService.cs Bu tek bir hakikat kaynağıdır, ne zaman GetCategories çağrıldığında veritabanından yeni bilgiler alır.
Rowin

@Rowin sonuncusu, yeni kategoriye ne eklemek istediğinizi varsayar ve aslında değiştirilen kaydetme hakkında hiçbir şey eklemediğim tüm Kategoriler listesini değil, değil mi? bu senin sorunun değildi ve zaten ustalaştın. Bu nedenle, kategori parametrenizdeki düzenin, onunla karşılaştırmanız nedeniyle zaten doğru şekilde ayarlandığını ve nasıl ayarlandığını göremediğimizi de varsayıyorum. O zaman savecategory'yi aramadan önce ayarladınız mı? parametre kategori manupulate yok ama sadece bir şans olarak sadece bunu eklemek gibi hep 0 oldu?
T. Nielsen

Siparişten değer, 0'dan geçerli kategori miktarına veya bir tane oluştururken 0'dan geçerli kategori + 1 miktarına kadar seçim yapabileceğiniz bir açılır menüden gelir. Savecategory'ye aktarılıyor. Şimdi yapmaya çalıştığım şey, "Yeni" bir liste oluşturmak. Yeni kategoriye yer açmak için her şeyin yukarı kaydırıldığı yer. Bundan sonra kaydediliyor ve aslında veritabanına ekleniyor. Bu, yeni kategoriler oluştururken iyi çalışır, ancak mevcut belgeleri düzenlerken bu, doğru sırada kalacak şekilde yukarı doğru kaymaz.
Rowin

Diğer dillerde

Bu sayfa diğer dillerde

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