Comment raccordez-vous correctement les boutons créés dynamiquement dans Blazor?

.net-standard blazor c# razor

Question

Je suis assez nouveau sur le web, mais je pense que ce serait bien d’avoir des boutons à bascule pour chaque "défaut" dans une matrice que j’affichais (pour que vous puissiez choisir un chemin qui remonte la matrice).

Heureusement, j'ai découvert comment créer des boutons de manière dynamique dans Blazor ... Malheureusement, je n'arrive pas à comprendre comment "câbler" les boutons.

Si je faisais statiquement un bouton, je pourrais dire onclick = "@ (() => alignment.ChangeArrow (1))" pour le premier emplacement de défaut, remplacez le 1 par un 2 pour le second, etc ...

En lui donnant 1 (au lieu de i) dans l'extrait de code ci-dessous, tous les boutons fonctionnent pour le 1er défaut, mais si je lui donne la variable i, alors ça ne marche pas du tout?

@for (int i = 0; i < alignment.FlawList.Count; i++)
{
    <button class="button" style="background-color:@alignment.ReturnColor(i)" onclick="@(()=>alignment.ChangeArrow(i))">@alignment.FlawList[i] @i</button>
}

Existe-t-il un meilleur Blazor, un moyen Web de faire ce dont je parle?

Merci pour tout conseil.

Réponse acceptée

Essaye ça:

@for (int i = 0; i < alignment.FlawList.Count; i++)
{
   var local_i = i;
    <button class="button" style="background-color:@alignment.ReturnColor(local_i)" onclick="@(()=>alignment.ChangeArrow(local_i))">@alignment.FlawList[local_i] @local_i</button>
}

Réponse populaire

Cela peut fonctionner avec des ajustements .... aucune idée sur les performances, etc. Semblait amusant à faire de toute façon. Cela me rappelle de faire Winforms, mais je n'aime vraiment pas faire du code long derrière WinForms. Il est intéressant de pouvoir générer RenderFragments en C #.


Placez une balise RenderFragment dans le fichier cshtml. (Où que vous en ayez besoin rendu sur la page)

@MyFragment

Créer la méthode Change Arrow

void ChangeArrow(int i)
{
    Console.WriteLine("Changing arrow");
}

Générer le délégué RenderFragment

static RenderFragment MyFragment = build =>
    {
        for (int i = 0; i < alignment.FlawList.Count; i++)
        {
            build.OpenElement(i + 101, "button"); //Open Element
            build.AddAttribute(i + 101, "style",
                $"background-color:{alignment.ReturnColor(i)}");
            build.AddAttribute(i + 101, "onclick", ChangeArrow(i)); // Assign Func to the onclick Attribute
            build.AddContent(i + 101, $"{alignment.FlawList[i]} {i}");
            build.CloseComponent(); //Making sure to close Element
        }
    };    


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi