Ajouter dynamiquement (par programme) des cases à cocher et des événements cochés modifiés

StackOverflow https://stackoverflow.com/questions/626889

  •  06-07-2019
  •  | 
  •  

Question

J'ai quelques difficultés à ajouter quelques cases à cocher et un gestionnaire d’événements par programmation. Les cases à cocher semblent toutes correctes, mais elles ne font rien lorsqu'elles sont cliquées. Quelqu'un a-t-il une idée de ce que je fais mal?

Mon code:

foreach (Statement i in theseStatements)
{
    box = new CheckBox();
    box.Text = i.StatementText;
    box.AutoPostBack = true;
    box.CheckedChanged += new EventHandler(this.CheckedChange);
    PlaceHolder.Controls.Add(box);
}

protected void CheckedChange(object sender, EventArgs e) 
{
    CheckBox x = (CheckBox)sender;
    Instructions.Text = "change";            
    WorkPlaceHazardsBox.Text += x.Text;
} 
Était-ce utile?

La solution

Vous devez procéder comme suit:

  1. Définissez la propriété ID pour chaque instance de CheckBox que vous créez dans votre boucle foreach .
  2. Pour les PostBacks, assurez-vous que vos cases à cocher sont créées et que le gestionnaire d'événements CheckedChanged est attaché à un moment donné du cycle de vie de la page avant que les événements de contrôle ne soient générés

Autres conseils

Assurez-vous de bien effectuer les opérations suivantes:

  • La même liste de cases à cocher est ajoutée lors du chargement initial et des publications ultérieures
  • Vous définissez un ID différent pour chaque case à cocher
  • Vérifiez que vous recevez une publication (définissez un point d'arrêt dans Chargement de la page)
  • Les contrôles sont ajoutés à la page lors du chargement de la page ou mieux encore au démarrage de la page

Si vous essayez de faire autre chose, mettez-nous à jour avec plus d'informations.

Si vous avez une zone de texte Instructions et une zone de texte WorkPlaceHazards par case à cocher, vous devez pouvoir associer la case à cocher sur laquelle vous avez cliqué avec ces deux autres contrôles.

Si ce n'est pas le cas, que sont-ils censés faire?

Lorsque vous dites qu'ils "ne font rien". - recevez-vous la publication?

Je ne serais pas surpris si vous deviez attribuer des identifiants aux cases à cocher - n'oubliez pas qu'à la publication, vous obtiendrez une nouvelle page. Il faudra donc recréer toutes les cases à cocher, puis déterminer lesquelles. on a vérifié, etc. Il s’agit d’entrer dans ce qui est (pour moi, en tout cas) un côté un peu magique d’ASP.NET. Je pense que vous devrez étudier le cycle de vie des pages et contrôler l’identification des choses avec suffisamment de soin.

Vous pouvez obtenir une valeur par la méthode Request [" controlname "] lorsque vous insérez le contrôle au moment de l'exécution. Vous devez définir un identifiant unique pour chaque contrôle.

Cependant, vous pouvez utiliser CheckBoxList comme alternative aux cases à cocher ajoutées de manière dynamique

J'ai copié votre code dans un nouveau projet Web VS2005 C # (voir ci-dessous). Votre code fonctionne. Il se peut qu'il se passe autre chose en dehors de cet extrait. Ou bien la propriété StatementText de toute votre collection d'instructions est-elle toujours vide?

Page ...

<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
        Instructions: <asp:TextBox ID="Instructions" runat="server" />
        WorkPlaceHazardsBox: <asp:TextBox ID="WorkPlaceHazardsBox" runat="server" />
    </div>
    </form>

</body>

Code derrière ...

using System;
using System.Data;
using System.Configuration;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace CheckboxMadness
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            List<string> statements = new List<string>(new string[] { "foo", "bar" });

            foreach (string i in statements)
            {
                CheckBox box = new CheckBox();
                box.Text = i;
                box.AutoPostBack = true;
                box.CheckedChanged += new EventHandler(this.CheckedChange);
                PlaceHolder1.Controls.Add(box);
            }

        }
        protected void CheckedChange(object sender, EventArgs e)
        {
            CheckBox x = (CheckBox)sender;

            Instructions.Text = "change";

            WorkPlaceHazardsBox.Text += x.Text;
        }
    }
}

CheckedChanged peut ne pas fonctionner s'il est incorporé à un autre contrôle, par exemple. incorporé dans les TableCell . Essayez de créer une CheckBox et d'ajouter CheckedChanged avant de créer un contrôle externe (par exemple, Table est un contrôle externe si CheckBox est incorporé dans les cellules de la table) .

Cela pourrait résoudre le problème dans certains cas.

var box = new CheckBox();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top