gpt4 book ai didi

c# - 绑定(bind)到动态加载的用户控件中的事件

转载 作者:太空狗 更新时间:2023-10-30 01:25:31 24 4
gpt4 key购买 nike

我正在构建一个测试项目来演示(向我)如何动态加载用户控件。一切正常,除了控件的接线以通知父级发生了某些事情。问题在于试图将用户控件中的事件连接到父页面中的事件处理程序的行。 “NotifyParentEvent”事件不可见,编译器对其进行 barfs(该事件未在 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();
}
}
}

最佳答案

选项 1

您需要将您的控件强制转换为实现 NotifyParentEvent 事件的类型,以便附加事件处理程序。基本上,在您的 ReloadControl 方法中,替换这行代码:

control.NotifyParentEvent += new EventHandler(UserControlNotificationHandler);

具有以下内容:

if(control is UserControls_WebUserControl1) 
{
(control as UserControls_WebUserControl1).NotifyParentEvent += new EventHandler(UserControlNotificationHandler);
}

选项 2

更通用的方法是创建一个接口(interface)并检查动态控件是否实现了该接口(interface)。

创建界面:

interface INotifyParent
{
event CommandEventHandler NotifyParentEvent;
}

实现接口(interface):

public partial class UserControls_WebUserControl1 : System.Web.UI.UserControl, INotifyParent
{
public event CommandEventHandler NotifyParentEvent;

private void NotifyParent(string message)
{
if (NotifyParentEvent != null)
{
CommandEventArgs e = new CommandEventArgs("Control1 Action", message);
NotifyParentEvent(this, e);
}
}
}

检查动态控件是否实现了接口(interface):

if(control is INotifyParent) 
{
(control as INotifyParent).NotifyParentEvent += new EventHandler(UserControlNotificationHandler);
}

关于c# - 绑定(bind)到动态加载的用户控件中的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6768262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com