向容器(PlaceHolder)中动态添加多个用户控件(UserControl)

问题是这样的:

我在页面里有一个PlaceHolder容器,然后有一个Button;

     < form  id ="form1"  runat ="server" >
    
< div >
    
< asp:PlaceHolder  ID ="ucHolder"  runat ="server" ></ asp:PlaceHolder >
    
</ div >
    
< div >
        
< asp:Button  ID ="btnAddUC"  runat ="server"  Text ="Add User Control"   />
    
</ div >
    
</ form >

当我点击Button的时候,PlaceHolder中动态加载一个UserControl,每点击一次按钮,多加载一个UserControl,如果已经加载的UserControl有值,需要保留原来的值。

好了,下面开始具体的实现

首先,我新建一个Aspx的页面和一个Ascx的用户控件,然后在Aspx页面的Page_Load事件中为Button添加Click事件;

ContractedBlock.gif ExpandedBlockStart.gif Code
btnAddUC.Click += new EventHandler(btnAddUC_Click);

还需要定义一个变量变量 Count,保存到 ViewState 中,记录 UserControl 的个数

ContractedBlock.gif ExpandedBlockStart.gif Code
    int Count
    {
        
get
        {
            
if (ViewState["ControlCount"== null)
                ViewState[
"ControlCount"= 1;
            
return (int)ViewState["ControlCount"];
        }
        
set
        {
            ViewState[
"ControlCount"= value;
        }
    }

按钮点击方法如下

ContractedBlock.gif ExpandedBlockStart.gif Code
    void btnAddUC_Click(object sender, EventArgs e)
    {
        Count
++;
        LoadUserControl(Count);
    }

加载用户控件的方法

ContractedBlock.gif ExpandedBlockStart.gif Code
    void LoadUserControl(int index)
    {
        Control ctl 
= this.LoadControl("~/WebUserControl.ascx");
        ctl.ID 
= string.Format("userControl_{0}", index);
        
this.ucHolder.Controls.Add(ctl);
    }

这里注意,因为Asp.Net 的页面有一个Element Tree结构,会保存控件的状态的,所以加载的UserControl的ID要固定,就向上面 ctl.ID = string.Format("userControl_{0}", index); 每次加载控件的ID 都固定的

然后由于Asp.Net保存控件状态用的是ViewState,所以我们加载控件的实现需要在ViewState之后,我们放在页面的Page_Load事件中

ContractedBlock.gif ExpandedBlockStart.gif Code
        for (int i = 1; i <= Count; i++)
        {
            LoadUserControl(i);
        }

OK,这样就完成了

 2009031722180086.png

附:源代码

转载于:https://www.cnblogs.com/chenjilv/archive/2009/03/17/1414152.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值