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?
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