AJout dynamique de controle AJAX TabPanel... [Résolu]

Signaler
Messages postés
4
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
7 novembre 2008
-
Messages postés
4
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
7 novembre 2008
-
Bonjour,
Une bonne âme pourrait elle  m'aider à résoudre ce petit problème SVP.
J’essaie désespérément d’ajouter dynamiquement un  contrôle Ajax TabPanel à un contrôle Ajax TabContainer.
Ce n’est pas l’ajout en lui-même qui me pose soucis mais plutôt le ReLoad de la page sur un PostBack :

J’ai une page ASPX avec un Control Ajax TabContainer dépourvu de tout TabPanel.
Dans cette même page j’ai aussi 2 Contrôles Button.
Le premier Button  ajoute un TabPanel au TabContainer sur son event Click. Juque la tout est Ok.
Le second bouton n’a aucun code, il est juste la pour déclencher une PostBack ; Et c’est la que ca merde ; En effet, sur le Page_Load de la page ASPX je recréé le TabPanel  et la j’ai une exception :




L'argument spécifié n'était pas dans les limites de la plage des valeurs valides.
Nom du paramètre : value


<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>






Voici mon code (je développe sous VS 2008 en C# sur framework ASP.NET 3.5)

Code de la page ASPX :
<form
id="form1"
runat="server">

<div>

<asp:ScriptManager
ID="ScriptManager1"
runat="server">
</asp:ScriptManager>
<cc1:TabContainer
ID="_ajxTabContainer"
runat="server">
</cc1:TabContainer>
<br
/>
<asp:Button
ID="Button1"
runat="server"
onclick="Button1_Click"
Text="Add Tab"
/>
<asp:Button
ID="Button2"
runat="server"
onclick="Button2_Click"
Text="Postback"
/>
</div>
</form>

CodeBehind associé :
protected
void Page_Init(
object sender,
EventArgs e)
{ }

protected
void Page_Load(
object sender,
EventArgs e)
{

   if (Page.IsPostBack)
   {

      if (Session[
"Tabs"] !=
null)
      {

         TabPanelCollection lTabs = (
TabPanelCollection)Session[
"Tabs"];

         foreach (
TabPanel tp
in lTabs)
            _ajxTabContainer.Tabs.Add(tp);

         _ajxTabContainer.ActiveTab = _ajxTabContainer.Tabs[0];
      }
   }
}

protected
void Button1_Click(
object sender,
EventArgs e)
{
System.Web.UI.HtmlControls.
HtmlGenericControl lTPContent =
new System.Web.UI.HtmlControls.
HtmlGenericControl();

Control lCtrl =
new
LiteralControl(
"
Yes it's green !
");
lTPContent.Controls.Add(lCtrl);

AjaxControlToolkit.
TabPanel lTabPan =
new AjaxControlToolkit.
TabPanel();
lTabPan.HeaderText =
"Dynamic TP Green";
lTabPan.Controls.Add(lTPContent);

_ajxTabContainer.Tabs.Add(lTabPan);
_ajxTabContainer.ActiveTab = lTabPan;Session[

"Tabs"] = _ajxTabContainer.Tabs;
}

protected
void Button2_Click(
object sender,
EventArgs e){}

Merci.
Christ.

4 réponses

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
28
Salut,

Regardes ce post
Le control tabpanel est un controle qui est assez bizarre d'utilisation et même légèrement buggé.
Du moins, il n'est pas totalement opérationnel et finit
(pas de designer, souvent obligé de passer par du javascript)
mais il est bien pratique pour faire des site Web.

Bon coding
Messages postés
4
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
7 novembre 2008

Arf, en fait, il ne faut essayer au PostBack d'ajouter les TabPanel  créés par le bouton; Il faut les ReCréer entièrement; J'ai supprimé le code de mon PageLoad, je l'ai légèrement modifié et je le place dans l'override de du OnInit :

protected

override
void OnInit(EventArgs e)
{
   base.OnInit(e);
   
   if (Session["Tabs"] != null)
   {
      TabPanelCollection lTabs = (TabPanelCollection)Session["Tabs"];
      foreach (TabPanel tp in lTabs)
      {
         TabPanel lTabPan = newTabPanel();
         lTabPan.HeaderText = tp.HeaderText;
         lTabPan.Controls.Add(tp.Controls[0]);
         _ajxTabContainer.Tabs.Add(lTabPan);
      }
      _ajxTabContainer.ActiveTab = _ajxTabContainer.Tabs[0];
   }
}protected
void Page_Init(object sender, EventArgs e) { }

protected
void Page_Load(object sender, EventArgs e) { }

protected
void Button1_Click(object sender, EventArgs e)
{
System.Web.UI.HtmlControls.HtmlGenericControl lTPContent = new System.Web.UI.HtmlControls.HtmlGenericControl();
Control lCtrl = newLiteralControl("
Yes it's green !
");
lTPContent.Controls.Add(lCtrl);

AjaxControlToolkit.TabPanel lTabPan = new AjaxControlToolkit.TabPanel();
lTabPan.HeaderText = "Dynamic TP Green";
lTabPan.Controls.Add(lTPContent);

_ajxTabContainer.Tabs.Add(lTabPan);
_ajxTabContainer.ActiveTab = lTabPan;

Session["Tabs"
] = _ajxTabContainer.Tabs;
}

protected
void Button2_Click(object sender, EventArgs e) { }

Merci nhervagault parceque tout comptre fait, la relecture de post que tu m'indiquais, m'a ouvert les yeux.

Maisj'avoue, même si maintenant ca fonctionne, que j'aimerai bien comprendre le pourquoi du comment !
Messages postés
4
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
7 novembre 2008

Merci pour ta réponse, mais le post que tu m'indique ne résoud pas vraiment mon probleme... effectivement la création de TabControl dans le PageLoad ne pose pas de soucis, c'est sur le Click d'un bouton que ca merde un peu

Mais merci tout de meme.
Christ.
Messages postés
4
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
7 novembre 2008

Petite précision, si je recréé dans le OnInit (override)  le TabPanel ajouté par le Click de mon Button,
au PostBack j'ai une nouvelle exception :
Les contrôles de script ne peuvent pas être inscrits après PreRender.