这段代码在我的ASPX页面中。下面显示的代码段用于根据用户在ASPX页面上做出的某些选择动态加载用户控件。
protected void loadUserControl(string tmUCName)
{
phDetail.Controls.Clear();
ViewState["vsControl"] = null;
UserControl tmUControl = LoadControl(tmUCName) as UserControl;
tmUControl.ID = "ucidControl";
phDetail.Controls.Add(tmUControl);
ViewState["vsControl"] = tmUCName;
}
ASCX工作,ASCX页面上的SELECT事件也是如此。我的问题是从ASCX页面上的select事件获取值到ASPX页面。由于用户控件(ASCX)是动态加载的(基于ASPX页面上的某些选择),我发现很难将事件从ASCX连接到ASPX页面。在一个明确的负载情况下,我没有问题......一切都非常好......
对于它的价值,如果页面是明确加载的,例如:
PlaceHolder1.Controls.Clear();
WebUserControlTest02 = LoadControl(@"~\WebUserControl2.ascx") as WebUserControl2;
WebUserControlTest02.gvASCX02SelectedIndexChanged += new EventHandler (WebUserControlTest02_gvASCX02SelectedIndexChanged);
PlaceHolder1.Controls.Add(WebUserControlTest02);
我在ASPX和ASCX页面之间连接事件没有问题。
答案 0 :(得分:1)
编辑:问答分为两部分。第一部分是如何"bubble" UserControl
内控件上发生的事件。这是通过处理内部控件的事件然后在UserControl
本身上触发类似的事件来完成的。在这种情况下,UserControl's
事件与内部控件的事件共享相同的名称和签名。这不是必需的,但在这种情况下,这样做是有道理的。
第二部分是如何动态加载UserControls
但仍然包含在每个UserControl
类上定义的这个冒泡事件的包含网页。问题是ASP.NET UserControl
类本身没有定义事件,动态加载的UserControls
的唯一常见方面是它们都是UserControl
类型的事实。
通过让所有UserControls
实现定义事件的公共接口来解决此问题。通过将UserControl
变量强制转换为接口类型,您可以访问接口定义的事件。那时你可以连接网页来处理这个事件。
这两个部分一起允许ListBox
控件中的事件由包含UserControl
的{{1}}重复,并且对于动态加载了ListBox
的网页UserControl
听取并回应同一事件。
首先使用您想要处理的事件定义一个接口:
public interface IMyUserControl
{
event EventHandler SelectedIndexChanged;
}
接下来,让每个UserControl实现此事件并连接列表框的SelectedIndexChanged
事件:
public partial class WebUserControl1 : System.Web.UI.UserControl, IMyUserControl
{
protected void Page_Load(object sender, EventArgs e)
{
ListBox1.SelectedIndexChanged += (o, args) =>
{
var selectedIndexChanged = SelectedIndexChanged;
if (selectedIndexChanged != null)
selectedIndexChanged(o, args);
};
}
public event EventHandler SelectedIndexChanged;
}
现在在您的公共代码中,将UserControl转换为接口类型和中提琴,您可以访问事件:
protected void loadUserControl(string tmUCName)
{
phDetail.Controls.Clear();
ViewState["vsControl"] = null;
UserControl tmUControl = LoadControl(tmUCName) as UserControl;
tmUControl.ID = "ucidControl";
phDetail.Controls.Add(tmUControl);
ViewState["vsControl"] = tmUCName;
((IMyUserControl)tmUControl).SelectedIndexChanged += OnUserControlSelectedIndexChanged
}
private void OnUserControlSelectedIndexChanged(object sender, EventArgs args)
{
// ...
}