从程序集和连接事件加载服务器控件
本文关键字:加载 服务器控件 事件 连接 程序集 | 更新日期: 2023-09-27 18:00:57
我有几个服务器控件,每个控件都在一个单独的程序集中,我想根据一些选择将其中一个动态加载到页面中。但是,控件中的服务器端事件似乎没有启动,这是一个问题。
例如,控件的形式为:
[ToolboxData("<{0}:MyPlugin runat=server></{0}:MyPlugin>")]
public class MyPlugin : WebControl, PluginSystem.Interface.IMyPlugins
{
protected override void RenderContents(HtmlTextWriter output)
{
...
_btn = new Button();
_btn.ID = "btnSave";
this.Controls.Add(_btn);
_btn.Click += new EventHandler(btn_Click);
_btn.RenderControl(output);
}
void btn_Click(object sender, EventArgs e)
{
//do something. This doesn't fire
}
}
控件从其组件加载:
public static IMyPlugins GetPlugin(string assembly, string type)
{
var t = Type.GetType(type + ", " + assembly);
IMyPlugins rtn = (IMyPlugins)Activator.CreateInstance(t);
rtn.Initialise();
return rtn;
}
如何将加载的程序集注入页面,以便激发控件中的事件?这可能吗?
谢谢你的帮助!
在页面生命周期中添加控件太晚了。在OnInit Page事件中添加服务器端控件是您的最佳选择。
查看此链接以了解生命周期过程的概述。控件需要在回发事件处理发生时创建。这个系列也很好。
因此,根据用户选择动态更改页面可能会让人头疼。有几个选项可供选择。最简单的方法是在OnInit中添加所有控件,然后在知道用户所做的选择后将其删除。
如果它真的是完全动态的,并且在处理回发之后才知道要呈现什么控件,那么可以更容易地脱离ASP.NET的视图状态/回发系统,自己检查。在页面生命周期中的任何时候,您都可以通过检查Form.Request集合来获取所有post值。