IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Ajax Discussion :

[ASP.NET ajax] Génération dynamique d'élément graphique


Sujet :

ASP.NET Ajax

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut [ASP.NET ajax] Génération dynamique d'élément graphique
    Bonjour,

    Je cherche à générer tout bêtement des éléments graphiques depuis le côté serveur dans une application ASP.NET tout ce qu'il y a de plus basique.

    J'arrive à le faire lorsque je suis dans une page ASP.NET et que je n'ai référencé aucune master page, en revanche dès que j'en référence une cela ne fonctionne plus.

    Voici le code simpliste que j'utilise, il ajoute un champs TextBox lors de l’appui sur un Bouton. Côté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MonTest.aspx.cs" Inherits="Steervex.Gestion.MonTest" MasterPageFile="~/Site.master"%>
     
    <asp:Content ID="ContentGrpProg" ContentPlaceHolderID="MainContent" runat="Server">
     
        <asp:Panel ID="divProgsAndGrpMarch" runat="server">
        </asp:Panel>
        <br />
        <br />
        <asp:ImageButton ID="btnAddLiaisonGrpProg" runat="server" ImageUrl="~/App_theme/Img/Add.png" ToolTip="Ajouter un couple" OnClick="btnAddLiaisonGrpProg_Click" />
     
     
    </asp:Content>
    Côté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
     
    namespace Steervex.Gestion
    {
        public partial class MonTest : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
     
            }
     
            protected void Page_PreInit(object sender, EventArgs e)
            {
                // Avant d'écraser les éléments créés précédemment dynamiquement, on les recrée pour les conserver
                // Ici, récupère la liste de tous les controls créé dynamiquement (grâce à une partie de l'ID (txtDynamic)
                List<string> keys = Request.Form.AllKeys.Where(key => key.Contains("txtDynamic")).ToList();
                int i = 1;
                foreach (string key in keys)
                {
                    // On recréé les textbox qu'on avait créé dynamiquement (sinon disparition de la textbox)
                    this.CreateTextBox("txtDynamic" + i);
                    i++;
                }
            }
     
            protected void btnAddLiaisonGrpProg_Click(object sender, ImageClickEventArgs e)
            {
                // On créé les textboxs dynamiquement
                int index = divProgsAndGrpMarch.Controls.OfType<DropDownList>().ToList().Count + 1;
                this.CreateTextBox("txtDynamic" + index);
            }
     
     
            /// <summary>
            /// Création des textbox + saut ligne
            /// </summary>
            /// <param name="id"></param>
            private void CreateTextBox(string id)
            {
                // Création textbox
                TextBox txt = new TextBox();
                txt.ID = id;
                divProgsAndGrpMarch.Controls.Add(txt);
     
                // Création saut de ligne
                Literal lt = new Literal();
                lt.Text = "<br />";
                divProgsAndGrpMarch.Controls.Add(lt);
            }
        }
    }
    Sans Master Page ce code fonctionne. Si je référence ma master page, comme c'est le cas dans cet exemple, lors du premier appui sur le bouton tout se passe bien, la TexteBox est ajoutée. En revanche lorsque je rappui sur le bouton, ce coup-ci c'est la ligne "divProgsAndGrpMarch.Controls.Add(txt);" de la fonction CreateTextBox qui me renvoie une erreur. Mon panel "divProgsAndGrpMarch" n'existe plus, il est à null.

    Savez-vous m'expliquer ce que j'ai pu oublier ? Pourquoi mon élément panel (créé non dynamiquement, présent à l'origine) passe à null comme cela ?

    Merci d'avance !

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Quelle est l'erreur généré ? Et que contient ta master page ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    L'erreur générée est une erreur classique :
    La référence d'objet n'est pas définie à une instance d'un objet.
    En gros je vois bien que tant que mon objet divProgsAndGrpMarch est à null je ne peux rien en tirer. Mais pourquoi est-il à null ?

    Ma master page est quasi vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="Steervex.SiteMaster" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>Mon site</title>
        <script type="text/javascript" src="../Scripts/jquery-ui.min.js"></script> 
        <asp:ContentPlaceHolder ID="HeadContent" runat="server">
        </asp:ContentPlaceHolder>
    </head>
     
    <body>
        <div id="wrapper">
            <form id="form1" runat="server">
     
                <div id="content">
                    <asp:ContentPlaceHolder ID="MainContent" runat="server">
     
                    </asp:ContentPlaceHolder>
                </div>
     
            </form>
        </div>
    </body>
    </html>
    Merci pour ton aide.

  4. #4
    Membre confirmé Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Points : 473
    Points
    473
    Par défaut
    Salut,

    Tu ne dois pas instancier ta classe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    divProgsAndGrpMarch monObjet = new divProgsAndGrpMarch();
    Après tu fais des add en utilisant "monObjet" .

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    A priori, lors d'ajout de contrôle dynamique, tu dois recréer tes éléments dans ton page_load. Tu peux donc essayer de placer le code du preInit dans le page_load, peut-être ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    Désolé pour ma réponse tardive.

    @Julien698 : divProgsAndGrpMarch n'est pas une classe mais bel et bien un objet ASP.net créé.

    @synergie35 : Effectivement cela permet de recréer les éléments, c'était bien cela le problème. Il y avait néanmoins une petite erreur dans mon code à cette ligne dans la fonction btnAddLiaisonGrpProg_Click :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int index = divProgsAndGrpMarch.Controls.OfType<DropDownList>().ToList().Count + 1;
    Je recherchais les index DropDownList alors que je créé des TextBox. Donc il fallait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int index = divProgsAndGrpMarch.Controls.OfType<TextBox>().ToList().Count + 1;

    Merci à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. asp.net + ajax extension
    Par namto dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/08/2007, 18h45
  2. Réponses: 4
    Dernier message: 27/06/2007, 10h13
  3. probleme avec asp.net ajax
    Par tarajji dans le forum ASP.NET
    Réponses: 3
    Dernier message: 26/03/2007, 11h43
  4. Réponses: 3
    Dernier message: 20/09/2004, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo