【发布时间】:2011-07-21 22:40:50
【问题描述】:
我正在构建一个测试项目来演示(向我)如何动态加载用户控件。一切正常,除了控件的接线以通知父母发生了什么事。问题在于尝试将用户控件中的事件连接到父页面中的事件处理程序的行。 “NotifyParentEvent”事件是不可见的,并且编译器会在它上面出错(该事件未在 System.Web.UI.Control 中定义)。我曾尝试使用 UserControl 而不是 Control,但无济于事。
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();
}
}
}
【问题讨论】:
-
在下面编辑了我的问题,如果有帮助请告诉我
标签: c# dynamic user-controls event-handling