Je suis en train de construire un projet de test pour démontrer (à moi) comment charger dynamiquement les contrôles utilisateur. Tout fonctionne sauf le câblage du contrôle pour informer le parent que quelque chose s'est passé. Le problème est avec la ligne qui essaie de connecter l'événement dans le contrôle utilisateur au gestionnaire d'événements dans la page parent. L'événement "NotifyParentEvent" n'est pas visible et le compilateur l'affiche (l'événement n'est pas défini dans System.Web.UI.Control). J'ai essayé d'utiliser UserControl au lieu de Control, mais en vain.Liaison aux événements dans les contrôles utilisateur chargés dynamiquement
Control control = Page.LoadControl(SavedControlVirtualPath);
if (control != null)
{
control.ID = control.GetType().Name;
>>>>> control.NotifyParentEvent += new EventHandler(UserControlNotificationHandler);
controlPlaceholder.Controls.Add(control);
}
code derrière pour le contrôle de l'utilisateur:
public partial class UserControls_WebUserControl1 : System.Web.UI.UserControl
{
public event CommandEventHandler NotifyParentEvent;
private void NotifyParent(string message)
{
if (NotifyParentEvent != null)
{
CommandEventArgs e = new CommandEventArgs("Control1 Action", message);
NotifyParentEvent(this, e);
}
}
}
Parent Page:
public partial class _Default : System.Web.UI.Page
{
private string SavedControlVirtualPath
{
get {return (ViewState["savedControlPath"] == null || (string)ViewState["savedControlPath"] == string.Empty)
? null : (string)ViewState["savedControlPath"]; }
set { ViewState["savedControlPath"] = value; }
}
private void ReloadControl()
{
controlPlaceholder.Controls.Clear();
if (SavedControlVirtualPath != null)
{
Control control = Page.LoadControl(SavedControlVirtualPath);
if (control != null)
{
// Gives the control a unique ID. It is important to ensure
// the page working properly. Here we use control.GetType().Name
// as the ID.
control.ID = control.GetType().Name;
control.NotifyParentEvent += new EventHandler(UserControlNotificationHandler); <== THIS LINE WON'T COMPILE
controlPlaceholder.Controls.Add(control);
}
}
}
private void UserControlNotificationHandler(object sender, CommandEventArgs e)
{
// ???
}
protected void Page_Init(object sender, EventArgs e)
{
lblLastEvent.Text += "Page_Init<br />";
LoadUserControls();
}
protected void Page_Load(object sender, EventArgs e)
{
lblLastEvent.Text += string.Format("{0} on main page<br />", (this.IsPostBack) ? "Postback" : "Page_Load");
ReloadControl();
}
protected void rblControlSelector_Changed(object sender, EventArgs e)
{
lblLastEvent.Text += "rblControlSelector_Changed<br />";
LoadUserControls();
}
private void LoadUserControls()
{
Label lbl = new Label();
controlPlaceholder.Controls.Clear();
switch (rblControlSelector.SelectedValue)
{
case "0":
lblLastEvent.Text = "Unload/Clear<br />";
SavedControlVirtualPath = "";
break;
case "1":
lblLastEvent.Text += "Adding control #1<br />";
SavedControlVirtualPath = "~/UserControls/WebUserControl1.ascx";
break;
case "2":
lblLastEvent.Text += "Adding control #2<br />";
SavedControlVirtualPath = "~/UserControls/WebUserControl2.ascx";
break;
case "3":
lblLastEvent.Text += "Adding control #3<br />";
SavedControlVirtualPath = "~/UserControls/WebUserControl3.ascx";
break;
}
if (!string.IsNullOrEmpty(SavedControlVirtualPath))
{
ReloadControl();
}
}
}
modifié ma question ci-dessous, laissez-moi savoir si ça aide –