none
création d'objets dynamiquement .. RRS feed

  • Question

  •  

    Bonjour Guillaume,

     

    j'aimerai aborder un sujet concernant la création d'objet mais de manière dynamique c'est à dire à la demande, j'expose mon exemple:

     

    sur mon formulaire ASP.NET, j'ai une DropDownList(ListBox) et une CheckBox.

     

    la ListBox contient 03 items (forfait1, forfait2, forfait3).

     

    ces deux objets sont presents dès le début sur mon formulaire, ce que je voudrait faire c'est que quand la CheckBox est cauché , celà crée les deux objets de manière identique sous les deux premiers (mais en ayant des noms differents de leur prédécesseur) et ainsi de suite pour les deuxièmes si la ChexkBox2 est cauché une troisième liste est créee ..etc.

     

    merci pour ton retour

     

    cdt

     

    lundi 31 mars 2008 15:17

Réponses

  • Bonjour,

    Voila un exemple qui vous permettera de débuter :

     

    Code Snippet

    ASPX

     

    <form id="form1" runat="server">

    <div id="container" runat="server"/>

    </form>

     

    CS

     

    // obtient ou définit le nombre de lignes

    private int LineCount

    {

    get

    {

    object value = this.ViewState["LineCount"];

    if (null != value)

    {

    return (int)value;

    }

     

    return 1;

    }

    set

    {

    this.ViewState["LineCount"] = Math.Max(1, value);

    }

    }

     

    protected override void OnLoad(EventArgs e)

    {

    base.OnLoad(e);

     

    // crée les lignes existantes

    int count = this.LineCount;

    for (int i = 0; i < count; ++i)

    {

    this.container.Controls.Add(this.CreateControl());

    }

    }

     

    protected void CheckedChangedHandler(object sender, EventArgs e)

    {

    CheckBox cbx = sender as CheckBox;

    if (null == cbx)

    {

    return;

    }

     

    if (cbx.Checked)

    {

    // ajoute une ligne

    ++this.LineCount;

    this.container.Controls.Add(this.CreateControl());

    }

    }

     

    private Control CreateControl()

    {

    // crée les controles pour une ligne

    CheckBox cbx = new CheckBox();

    cbx.AutoPostBack = true;

    cbx.CheckedChanged += new EventHandler(CheckedChangedHandler);

     

    DropDownList ddl = new DropDownList();

    ddl.Items.Add("forfait1");

    ddl.Items.Add("forfait2");

    ddl.Items.Add("forfait3");

     

    HtmlGenericControl div = new HtmlGenericControl("div");

    div.Controls.Add(cbx);

    div.Controls.Add(ddl);

     

    return div;

    }

     

     

    Vous pouvez remplacer la création de la ligne par le code par le chargement d'un UserControl en utilisant LoadControl, il faudra par contre que votre UserControl possède un évènement CheckedChanged levé lors du CheckedChanged de sa checkbox.
    mardi 1 avril 2008 08:19
  • Bonjour Guillaume,

     

    merci pour ta réponse, est-ce que tu peux m'expliquer ce que fait chaque partie du code CS stp??

     

    n'oublies pas que je débute dans le .net

     

    je te remercie

     

    Alexy ..

    mardi 1 avril 2008 12:03
  • Bonjour,

    Désolé, je n'avais pas beaucoup temps. Voila une explication :

    • Dans le cas d'ajout dynamique de cotnrole dans une page, il faut à chaque appel de la page via un PostBack recréer les controles dynamiques. Il faut d'autre par les recréer au plus tard lors du Load pour que les évènements qu'ils génèrent soient pris en compte.
    • La propriété LineCount permet de stocker, dans le ViewState, le nombre de ligne qu'il faut afficher. Par défaut une ligne. Cela permet de savoir combien de ligne il faut recréer lors d'un PostBack
    • La méthode CreateControl permet de créer en mémoire un DIV qui va contenir une CheckBox et une DropDownList. On associé à l'évènement CheckedChanged un handler pour pouvoir gérer l'ajout de ligne.
    • La méthode OnLoad est l'équivalent du Page_Load (en fait la méthode OnLoad de base lève l'évènement Load qui va appeler Page_Load. Plutot que d'avoir un appel de méthode via les évènements, je surcharge OnLoad directement).  Dans cette méthode il faut comme expliquer plus au rajouter à la page les lignes créées précédemment. Pour cela on appel autant de fois que nécessaire la méthode CreateControl et on ajoute le DIV créé en mémoire à la page dans le DIC d'id container.
    • Le handler CheckedChangedHandler est appelé à chaque fois que l'utilisateur coche ou décoche une CheckBox. On test donc dans un premier temps que la CheckBox est cochée et si c'est le cas, on ajoute une ligne et on incrémente LineCount pour qu'au prochain PostBack cette nouvelle ligne soit créée.

     

    mardi 1 avril 2008 12:22

Toutes les réponses

  • Bonjour,

    Voila un exemple qui vous permettera de débuter :

     

    Code Snippet

    ASPX

     

    <form id="form1" runat="server">

    <div id="container" runat="server"/>

    </form>

     

    CS

     

    // obtient ou définit le nombre de lignes

    private int LineCount

    {

    get

    {

    object value = this.ViewState["LineCount"];

    if (null != value)

    {

    return (int)value;

    }

     

    return 1;

    }

    set

    {

    this.ViewState["LineCount"] = Math.Max(1, value);

    }

    }

     

    protected override void OnLoad(EventArgs e)

    {

    base.OnLoad(e);

     

    // crée les lignes existantes

    int count = this.LineCount;

    for (int i = 0; i < count; ++i)

    {

    this.container.Controls.Add(this.CreateControl());

    }

    }

     

    protected void CheckedChangedHandler(object sender, EventArgs e)

    {

    CheckBox cbx = sender as CheckBox;

    if (null == cbx)

    {

    return;

    }

     

    if (cbx.Checked)

    {

    // ajoute une ligne

    ++this.LineCount;

    this.container.Controls.Add(this.CreateControl());

    }

    }

     

    private Control CreateControl()

    {

    // crée les controles pour une ligne

    CheckBox cbx = new CheckBox();

    cbx.AutoPostBack = true;

    cbx.CheckedChanged += new EventHandler(CheckedChangedHandler);

     

    DropDownList ddl = new DropDownList();

    ddl.Items.Add("forfait1");

    ddl.Items.Add("forfait2");

    ddl.Items.Add("forfait3");

     

    HtmlGenericControl div = new HtmlGenericControl("div");

    div.Controls.Add(cbx);

    div.Controls.Add(ddl);

     

    return div;

    }

     

     

    Vous pouvez remplacer la création de la ligne par le code par le chargement d'un UserControl en utilisant LoadControl, il faudra par contre que votre UserControl possède un évènement CheckedChanged levé lors du CheckedChanged de sa checkbox.
    mardi 1 avril 2008 08:19
  • Bonjour Guillaume,

     

    merci pour ta réponse, est-ce que tu peux m'expliquer ce que fait chaque partie du code CS stp??

     

    n'oublies pas que je débute dans le .net

     

    je te remercie

     

    Alexy ..

    mardi 1 avril 2008 12:03
  • Bonjour,

    Désolé, je n'avais pas beaucoup temps. Voila une explication :

    • Dans le cas d'ajout dynamique de cotnrole dans une page, il faut à chaque appel de la page via un PostBack recréer les controles dynamiques. Il faut d'autre par les recréer au plus tard lors du Load pour que les évènements qu'ils génèrent soient pris en compte.
    • La propriété LineCount permet de stocker, dans le ViewState, le nombre de ligne qu'il faut afficher. Par défaut une ligne. Cela permet de savoir combien de ligne il faut recréer lors d'un PostBack
    • La méthode CreateControl permet de créer en mémoire un DIV qui va contenir une CheckBox et une DropDownList. On associé à l'évènement CheckedChanged un handler pour pouvoir gérer l'ajout de ligne.
    • La méthode OnLoad est l'équivalent du Page_Load (en fait la méthode OnLoad de base lève l'évènement Load qui va appeler Page_Load. Plutot que d'avoir un appel de méthode via les évènements, je surcharge OnLoad directement).  Dans cette méthode il faut comme expliquer plus au rajouter à la page les lignes créées précédemment. Pour cela on appel autant de fois que nécessaire la méthode CreateControl et on ajoute le DIV créé en mémoire à la page dans le DIC d'id container.
    • Le handler CheckedChangedHandler est appelé à chaque fois que l'utilisateur coche ou décoche une CheckBox. On test donc dans un premier temps que la CheckBox est cochée et si c'est le cas, on ajoute une ligne et on incrémente LineCount pour qu'au prochain PostBack cette nouvelle ligne soit créée.

     

    mardi 1 avril 2008 12:22
  • Bonjour Guillaume,

     

    Merci pour ta réponse, je vais essayer de suivre petit à petit pour bien comprendre cette logique.

     

    Je te reviendrai si je bloque quelque part

     

    Merci

     

    Alexy..

    jeudi 3 avril 2008 17:16