Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何动态加载web用户控件?_C#_Asp.net_.net_Visual Studio 2010 - Fatal编程技术网

C# 如何动态加载web用户控件?

C# 如何动态加载web用户控件?,c#,asp.net,.net,visual-studio-2010,C#,Asp.net,.net,Visual Studio 2010,这是一个非常重要的问题。这让我在4小时内变得疯狂:(我可以加载ucadx.ascx,但如果我单击“在X中搜索”按钮,则不会加载UCSearchX用户控件。有3个按钮,还有3个web用户控件。我想在clickEvents之后加载这3个web用户控件。但下面的方法不起作用。如何动态加载web用户控件?单击(如选项卡控件) 使用下面的代码动态加载usercontrol var control = LoadControl(filePath) as ControlType; 然后您可以订阅事件并添加到控

这是一个非常重要的问题。这让我在4小时内变得疯狂:(我可以加载ucadx.ascx,但如果我单击“在X中搜索”按钮,则不会加载UCSearchX用户控件。有3个按钮,还有3个web用户控件。我想在clickEvents之后加载这3个web用户控件。但下面的方法不起作用。如何动态加载web用户控件?单击(如选项卡控件)


使用下面的代码动态加载usercontrol

var control = LoadControl(filePath) as ControlType;
然后您可以订阅事件并添加到控件占位符


希望这有帮助

试试这样的方法

//to load the control
     protected void Page_Init(object sender, EventArgs e)
     {
         ViewState["controlType"] = "AddSector";
         //you don't need to check the if condiontion, cause you load every time the controls
         AddUserControl();
      }
当您需要在回发后从控件获取值时,您应该打开它

protected void Page_PreRender(object sender, EventsArgs args) {
    //your placeholder that contains data
}

动态加载时的用户控件需要在加载的每个页面上加载,以便维护其视图状态。因此,您需要类似以下内容:

    public string CurrentControlToLoad
    {
        get
        {
             if(ViewState["controlType"] == null)
                 return "";
             return (string)ViewState["controlType"];
        }
        set
        {
             ViewState["controlType"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if(CurrentControlToLoad != "")
           LoadControl(CurrentControlToLoad);
    }

    protected void btnAddSector_Click(object sender, DirectEventArgs e)
    {
        CurrentControlToLoad = "AddSector";
        LoadControl(CurrentControlToLoad);
    }

在您的按钮单击事件中,我认为修改ViewState为时已晚。您可能需要会话状态。首先,我不认为4小时对于一个重要问题的解决或变得疯狂或疯狂来说是太多了。我记得几个问题花了我数周时间才解决。其次,与其动态加载这些用户控件,我宁愿将它们放入不同ASP.NET的
面板
控件中,并勾选它们的
可见性
属性,我不确定这是否是最好的方法。@Penguen为什么将信息存储在ViewState中而不是将其传递到add控件方法中?void AddUserControl(类型controlType)@顺便说一句,您正在pageLoad上调用AddUserControl方法并单击按钮…这是否意味着您正在尝试添加两个具有相同ID的控件???我不理解受保护的无效页面\u PreRender(对象发送方,事件args){//包含数据的占位符}在这里,您可以获得包含在控件中的控件中的数据,因为prerender事件几乎是最后一次发生,所以您将无法看到之前的值。
    public string CurrentControlToLoad
    {
        get
        {
             if(ViewState["controlType"] == null)
                 return "";
             return (string)ViewState["controlType"];
        }
        set
        {
             ViewState["controlType"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if(CurrentControlToLoad != "")
           LoadControl(CurrentControlToLoad);
    }

    protected void btnAddSector_Click(object sender, DirectEventArgs e)
    {
        CurrentControlToLoad = "AddSector";
        LoadControl(CurrentControlToLoad);
    }