[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:
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:
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 !