返回首页

简介
在许多我们业务的ASPX应用,是为执行特定功能,使他们能很容易地在整个应用程序重新使用的特殊的UserControls的需要。我们可以使用一个UserControl的方法有两种:要么我们拖到窗体,或通过使用LoadControl动态加载("; MyUserControl.ascxquot";)。当我们使用第二种方法,我们(?)遇到的一个主要问题:ViewState的持久性!回传后,当我们重新加载控制在我们的cs代码,。NET框架忘记一切有关其先前的状态。这个微小的文章解决了这个问题。解决方案!
简单:分配动态加载控件相同的ID,它只是之前的数据回传!事实上,。NET Framework中保留每个用户的状态控制(甚至动态加载的)和准其方案的ID后回传,试图寻找相同ID相同的控制,以载入先前的状态。可以更好地解释整个事情通过一个例子:-)范例
,我们将创建一个简单的UserControl一个TexBox,我们还会有一个ASPX的形式,对我们使用这种控制,但在三种方式。为此,我们将创建三个实例:这已经是拖到窗体上的实例动态创建一个实例通过LoadControl()它的ID通过LoadControl()动态创建一个实例保留
我已创建了一个简单UserControlViewStateManager的,这将帮助我们自动保存/加载动态加载控件和它们的ID。其主要思想这个小工具的背后是保存后装入他们的父容器,并重新创建后回传的用户控件的ID:最好的地方重新创建控件Page_Init事件。
当创建一个新的用户控制:只给一个唯一的ID,并在同一时间,将它添加到UserControlViewStateManager实例。下面显示的是代码片段:

Control userControl = LoadControl("MyUserControl.ascx");

userControl.ID = (placeHolder2.Controls.Count - 1).ToString();

placeHolder2.Controls.Add(userControl);

ucViewStateManager.AddControl(userControl);

在Page_Init事件,调用helper类ReCreateControlsID(),传递给它的容器对象作为参数:{C}
希望这有助于:-)在演示应用程序,你可以找到完整的源代码。

回答

评论会员:Aytha 时间:2011/12/14
SRY
评论会员:Kurmala 时间:2011/12/14
本{A}]关于这个问题有一个非常详细的解释。值得一点击
评论会员:。stanz9 时间:2011/12/14
嗨,
我的工作动态用户控件的。ascx在一个aspx页面。
我有ASPX,我该链接按钮,当我点击一个链接,该网页上加载ASCX控制。这是正常工作,但主要的问题是,当我使用后退按钮和执行上,它是给错误的UserControl采取行动。 plz帮助我,
评论会员:。xsoftdev 时间:2011/12/14
我有几个UserControls的,我动态加载。他们现在都堆放在页面上..显示所有。我需要做一个删除?

我的应用是想通过一个navigatin步骤。每一步都是一个新的UserControl。由下拉导航控制。

每次点击下拉,控制页面上的积累。

2008年2月27日(星期三),下午02:03
修改
评论会员:xsoftdev 时间:2011/12/14
喜Wesam和他人,

我喜欢您所提出的这还没有太大的探索加载动态的UserControls问题很常见的方式。

我已经测试多次与你的代码还没有在我的应用程序中使用它。还有一些事情在我的测试出问题,大多是错误的视图状态树没有被创建。
我在想,如果你能提供一些现实世界中使用的一些例子,如动态添加用户控件在ASP.Net Ajax的标签,使选项卡添加和编辑数据。
此外,这是一个确保拍摄的方式,在生产环境中的用户控件加载?

感谢。
评论会员:xsoftdev 时间:2011/12/14
您好,
我想知道如何可以传递之间的动态加载用户控件的值。
说我有我的网页,其中有一个DropDownList控制(UC1)静态用户。 我添加到页面上的占位符另一个控制动态(UC2)。 在选定的指数在UC1 DropDownList的改变我想触发一个事件,这将使得在UC2面板可见。
如何想法,我可以做到这一点?

感谢
评论会员:xsoftdev 时间:2011/12/14
在这种情况下,最好的做法是,客户端页面控制其UserControls的,即有UserControls的发布自己想要的属性/例程和客户端页面做的工作

回到你的问题,该解决方案将是:

1。创建公共事件处理程序,满足您的需求,如果没有具体的需求,您可以简单地使用标准的System.EventHandler 公共事件的EventHandler OnDropDownSelectedChanged; 2。请UC1.DropDownList.AutoPostBack = TRUE
3。为UC1创建一个事件处理程序,处理SelectedIndexChange &# 160; 私人无效DropDownList_SelectedIndexChanged(对象发件人,发送System.EventArgs)
{
(OnDropDownSelectedChanged!= NULL)
{
 60; OnDropDownSelectedChanged(发件人,E);
}
 60; } 4。 UC2,创建一个公共的属性来访问小组的Visible属性 公共布尔PanelVisible
{
& #160; 得到
{
  ; 返回Panel.Visible;
}

& #160; 集合
& #160; {
Panel.Visible =值;
}
  ; } 5。在您的主页,创建一个类型System.EventHandler
的事件处理程序
私人无效uc1_OnDropDownSelectedChanged(对象发件人,EventArgs的发送)
{
 0;uc2.PanelVisible = uc2.PanelVisible!
 60;} 6。在您的主页,在加载UC1,设置公共事件处理程序的刚刚创建的
之一
私人无效uc1_OnDropDownSelectedChanged(对象发件人,EventArgs的发送)
&# 160; {
uc2.PanelVisible = uc2.PanelVisible!
}
7。我们做了{S0}

希望这有助于,
Wesam

评论会员:兄弟路易 时间:2011/12/14
解释Wesam感谢。但不知何故,我还是我不知道如何访问在动态加载UserControl的公共财产。能否请你后一个例子。
感谢。
评论会员:肖恩Ewington 时间:2011/12/14
您好Wesam,

感谢伟大的例子。

我有一个有关你将如何卸载或删除的占位符先前添加的控件,当您添加一个新的问题。

我有5个用户控件,用户可以通过我的ASPX页面切换,我想能够删除以前的,当我点击加载{BR的5 UserControls的新实例。}
我假设,通过卸载它会使页面加载速度更快,因为不加载不需要的UserControl
感谢
评论会员:xsoftdev 时间:2011/12/14
我不知道我undersnatd你的问题很好吗?您可以通过调用简单:PlaceHoledr.Controls.Remove(ascx_control)卸载控制?我敢肯定,这是不是你的问题

Wesam
评论会员:mkhiami 时间:2011/12/14
我有,我与某些字段上创建一个UserControl,我增加了一个面板,然后一个nother的UserControl。然后,我做一些阅读和重复第二个UserControl的页面向下取决于一定的价值。我需要复制过的第一个用户控件右侧的第二usecontrol。

可有人请帮助我。
评论会员:Johnno74 时间:2011/12/14
我不知道我理解你的问题,你能否说明一点点borther Loius

Wesam
评论会员:Johnno74 时间:2011/12/14
。"嗨,亲爱的,我也试图获取用户控件回发后这个类,但有一些问题,在inetealizing控制设备上的用户控件按钮事件一样的事件Plese给我的解决方案,如果u提前问候:Manish塔瓦"
- manish.2004
评论会员:Volleyknaller 时间:2011/12/14
嗯...你说得对!也许,我需要再次修改的helper类最好的解决办法是添加调用例程从事件!即
您添加的控件,然后添加事件。
我将修改的助手和地方的新版本。
评论会员:Volleyknaller 时间:2011/12/14
您好,
当你添加新的版本?
感谢
评论会员:inetfly123 时间:2011/12/14
喜Wessam,

Marhaba

首先让我首先感谢你对这个职位。我创建了一个用户控件,将被用于执行对XML的搜索查询的数据源和控制工程优良。现在我想动态加载在页面上控制的几个实例(通过添加/删除按钮embdedded内部控制),但whenver页面回发的数据丢失,重新创建用户控件的实例,但没有数据重载知道使用UR atricle其他测试metioned的概念,工作得很好..能否请您给我发电子邮件,看看我们如何可以解决这个问题,知道我不介意共享源代码。




穆罕默德 - 黎巴嫩贝鲁特