AJout dynamique de controle AJAX TabPanel...

Résolu
cs_ChristM Messages postés 4 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 7 novembre 2008 - 7 nov. 2008 à 12:31
cs_ChristM Messages postés 4 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 7 novembre 2008 - 7 nov. 2008 à 15:23
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

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
7 nov. 2008 à 13:32
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
3
cs_ChristM Messages postés 4 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 7 novembre 2008
7 nov. 2008 à 15:23
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 !
3
cs_ChristM Messages postés 4 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 7 novembre 2008
7 nov. 2008 à 14:35
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.
0
cs_ChristM Messages postés 4 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 7 novembre 2008
7 nov. 2008 à 14:50
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.
0
Rejoignez-nous