私は、ユーザーコントロールを動的にロードする方法を(私に)実証するためのテストプロジェクトを構築しています。何かが起こったことを親に通知するためにコントロールの配線を除いてすべてが機能します。この問題は、ユーザーコントロールのイベントを親ページのイベントハンドラに接続しようとする行に問題があります。 "NotifyParentEvent"イベントは表示されず、コンパイラはそれを禁止します(イベントはSystem.Web.UI.Controlで定義されていません)。私は、コントロールの代わりにUserControlを使用しようとしましたが、無駄です。動的にロードされるユーザーコントロールのイベントへのバインド
Control control = Page.LoadControl(SavedControlVirtualPath);
if (control != null)
{
control.ID = control.GetType().Name;
>>>>> control.NotifyParentEvent += new EventHandler(UserControlNotificationHandler);
controlPlaceholder.Controls.Add(control);
}
ユーザーコントロールの背後にあるコード:
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);
}
}
}
親ページ:
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();
}
}
}
があれば私に知らせて、下記の私の質問を編集しましたそれは役に立ちます –