2010-01-26 7 views
0

Je suis en train de jouer avec des contrôles personnalisés, et ont construit un qui ressemble à ceci:contrôle personnalisé Non rendu après l'événement

<cc:Test ID="jqTestTest01" runat="server" OnTestClick="jqTestTest01_TestClick"> 
    <TestItems> 
      <asp:ListItem Text="Tab One" Value="1" Selected="True" /> 
      <asp:ListItem Text="Tab Two" Value="2" /> 
      <asp:ListItem Text="Tab Three" Value="3" /> 
      <asp:ListItem Text="Tab Four" Value="4" /> 
      <asp:ListItem Text="Tab Five" Value="5" /> 
    </TestItems> 
    <ContentTemplate> 
      <asp:Label ID="lblTestTest01" runat="server" Text="None" />    
    </ContentTemplate>  
</cc:Test> 

protected void jqTestTest01_TestClick(object sender, EventArgs e) 
{ 
    lblTestTest01.Text = "Click Event! " + DateTime.Now.ToLongTimeString();   
} 

Avec le code que j'ai tout est rendu bien sur la première charge. J'ai même un événement lié aux éléments de la liste qui se déclenche lorsqu'on clique dessus, et cela fonctionne. Le problème est que les mises à jour du contrôle personnalisé n'ont pas lieu. Pour cet exemple, j'essaie de désactiver la liste de l'utilisateur sur lequel j'ai cliqué pour la dernière fois et de m'assurer que tous les autres sont activés. Voici le code pour le contrôle:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.UI.WebControls; 
using System.Web.UI; 
using System.ComponentModel; 

namespace MyControls.jqTest 
{ 
    [ParseChildren(true), PersistChildren(false)] 
    public class Test : WebControl, INamingContainer 
    { 
     [ParseChildren(true, "Items")] 
     public class iTestItems 
     { 
      private ListItemCollection _Items; 

      [DefaultValue((string)null), MergableProperty(false), PersistenceMode(PersistenceMode.InnerDefaultProperty)] 
      public virtual ListItemCollection Items 
      { 
       get 
       { 
        if (_Items == null) 
         _Items = new ListItemCollection(); 

        return _Items; 
       } 
      } 
     } 

     private iTestItems _TestItems = null; 
     private ITemplate _ContentTemplate = null; 
     public event EventHandler TestClick = null; 

     [PersistenceMode(PersistenceMode.InnerProperty), 
     TemplateContainer(typeof(iTestItems)), 
     TemplateInstance(TemplateInstance.Single)] 
     public iTestItems TestItems 
     { 
      get { return _TestItems; } 
      set { _TestItems = value; } 
     } 

     [PersistenceMode(PersistenceMode.InnerProperty), 
     TemplateContainer(typeof(TemplateControl)), 
     TemplateInstance(TemplateInstance.Single)] 
     public ITemplate ContentTemplate 
     { 
      get { return _ContentTemplate; } 
      set { _ContentTemplate = value; } 
     } 

     protected override void CreateChildControls() 
     { 
      Controls.Clear(); 
      Control BtnList = new Control();    
      Controls.Add(BtnList); 

      Control Content = new Control(); 
      ContentTemplate.InstantiateIn(Content); 
      Controls.Add(Content); 
     } 

     void Btn_Click(object sender, EventArgs e) 
     { 
      Button Btn = (Button)sender; 
      foreach (ListItem i in _TestItems.Items) 
       i.Selected = (i.Text == Btn.Text) ? false : true; 

      if (TestClick != null) 
       TestClick(sender, e); 
     } 

     protected override void Render(HtmlTextWriter writer) 
     { 

      Control BtnList = Controls[0]; 
      BtnList.Controls.Clear(); 

      foreach (ListItem i in _TestItems.Items) 
      { 
       Button Btn = new Button(); 
       Btn.Text = i.Text; 
       Btn.Enabled = i.Selected ? false : true; 
       Btn.Click += new EventHandler(Btn_Click); 
       BtnList.Controls.Add(Btn); 
      } 

      base.Render(writer); 
     } 


    } 
} 

Je suis sûr que ce processus de rendu/createChildren que je ne suis pas en train de faire. Le problème est que je ne peux pas trouver un bon exemple qui montre comment redéclencher votre usercontrol quand quelque chose a besoin de mise à jour. Y a-t-il une bonne façon de faire cela?

+0

Juste vérifié la réponse POST - pour une raison quelconque, l'étiquette est mise à jour, mais le bouton en cours de désactivation revenir à l'état d'origine. – cschear

Répondre

1

Il me semble que tout ce qui est à l'intérieur de votre méthode Render() devrait être dans votre méthode CreateChildControls().

Render est de remplacer le code HTML réel qui est sorti par votre contrôle. Il sera appelé plus tard dans le cycle de vie lorsque le flux de réponse est généré.

CreateChildControls peut être appelée à plusieurs étapes du cycle de vie et sera appelée la première fois que votre contrôle doit être instancié, comme lors de la gestion de ViewState.

+0

Toujours pas de go. L'événement click se déclenche (l'étiquette est mise à jour), mais le bouton sélectionné n'est pas désactivé. – cschear

Questions connexes