Essayez d'insérer/trier une liste en fonction de l'Ordre de la valeur

0

La question

Je suis entrain de créer une documentation de l'application dans laquelle j'permettre à des personnes à l'intérieur de mon entreprise pour accéder à la documentation sur certains logiciels. Avec cela, j'ai une page où tout administrateur peut gérer les catégories et les utilisateurs. Pour cela, je veux de l'admin pour être en mesure de modifier l'ordre d'une catégorie dans laquelle il doit être affiché sur mon NavigationMenu. Maintenant, la partie où il doit commander correctement les catégories en se basant sur l'Ordre à l'intérieur de la NavigationMenu œuvres. Mais quand j'essaie de modifier les catégories existantes et de leurs numéros de commande, les commandes ne seront pas à jour en conséquence, voir cet exemple:

C'est avant de modifier les catégories existantes, ces catégories sont fraîchement ajoutée/fait New categories

C'est après l'édition des catégories, "Réagir" devrait être de l'Ordre de 2, Où API serait de l'Ordre de 0, et de Tester serait de l'Ordre de 1 Edited categories

Comme vous pouvez le voir, l'ordre n'a plus aucun sens. Évidemment, il ne devrait pas être permis à plus de 1 de n'importe quel ordre.

Maintenant, le problème est probablement à venir à partir de ce code.

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

L'ordre du code, qui va comme ceci:

CategoryDialog.rasoir

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

Le code ci-dessus est appelée après l'appui sur un bouton. Cela passe le long d'une catégorie avec un certain ordre, ce nombre est transmis le long à partir d'un simple menu déroulant.

L' SaveCategory la fonction ressemble à ceci:

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

Cette fonction appelle la problématique de la fonction avant la sauvegarde/rien ajouter à la base de données. Ainsi il peut prendre place pour la nouvelle d'ajouter ou de modifier de la catégorie.

Après cela, un Événement est déclenché pour notifier mon NavigationMenu que des changements ont été apportés, et il doit rendre à nouveau de le montrer. Cela n'a pas de problèmes.

Mais je ne vois pas comment je pourrais correctement les Ordres de figurer dans la liste lorsque je les change. Petit rappel, cette fonction ne fonctionne pas lors de la modification des catégories existantes. Si j'avais ajouter une nouvelle catégorie, par exemple à l'ordre 2. Il n'correctement maj à tout sans problème.

Toute aide est la bienvenue!

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

La meilleure réponse

0

Donc, si l'utilisateur tente d'en faire une seconde à dire de l'ordre de 2, il permettra de réduire le numéro d'ordre de celui qui était avant?

Votre boucle logique ne supporte pas que, parce que votre boucle est en augmentation par le temps, il arrive que vous ayez déjà passé la précédente, de sorte que vous aurez un double 1 sans doute, après.

Je pense que vous allez obtenir où vous voulez si votre changement de votre boucle de courir vers le bas comme votre poussant vers le bas, même si évidemment, vous aurez à l'ordonnance de soutien en dessous de zéro bientôt et qui n'est pas toujours pris en charge

POUR:

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

Mais pour tout ce pour donner un sens et pas en cours d'exécution pour ça, je leur suggère de pousser la commande vers le haut au lieu de cela, parce que positif numéros les plus élevés n'ont pas les mêmes problèmes dans les coins pour ainsi dire

Ou plutôt:

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

En fin de compte aussi, à moins que votre application est différente de celle que j'imagine, vous voulez ajouter la nouvelle catégorie et pas tous d'entre eux (à l'exclusion de ce nouveau) nouveau

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

J'ai essayé les 2 premières solutions, mais cela a abouti à la Commande restant à 0 lors de la création de nouvelles catégories. Je ne suis pas vraiment sûr de ce que la dernière solution n'. Mais si elle permet de "Catégories" est une liste à l'intérieur de CategoryService.cs C'est une source unique de la vérité, quand GetCategories est appelé, il s'empare de nouvelles informations à partir de la base de données.
Rowin

@Aviron de la dernière suppose que vous souhaitez insérer dans la nouvelle catégorie et non pas l'ensemble de la liste de Catégories, je ne comprend pas quelque chose sur le fait d'économie a changé, non? ce n'est pas votre problème et vous maîtrisez déjà que. Afin de parce que j'ai aussi présumer de l'ordre dans votre catégorie de paramètre est déjà correctement en raison de votre comparaison et nous ne voyons pas comment il est fixé. Avez-vous déjà avant d'appeler SaveCategory alors? comme nous n'avons pas manupulate le paramètre de la catégorie, mais il suffit de l'ajouter comme c'est la seule possibilité est qu'il était toujours à 0?
T. Nielsen

La valeur de la Commande provient d'un menu déroulant dans lequel vous pouvez sélectionner de 0 à la quantité actuelle de catégories, ou lors de la création de l'un, 0 pour le montant actuel des catégories + 1. Il est transmis le long de SaveCategory. Ce que j'essaie de faire maintenant, c'est de créer une "Nouvelle" à la liste. Où tout est décalé vers le haut pour faire de la place pour la nouvelle catégorie. Après lequel elle est enregistrée et fait ajoutées à la base de données. Cela fonctionne bien lors de la création de nouvelles catégories, mais lors de l'édition des documents existants, cela ne veut pas monter en conséquence pour rester dans le bon ordre.
Rowin

Dans d'autres langues

Cette page est dans d'autres langues

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