从程序集和连接事件加载服务器控件

本文关键字:加载 服务器控件 事件 连接 程序集 | 更新日期: 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值。