动态加载用户控件的组件!
2024-07-21 02:27:37
供稿:网友
我们写用户控件的目的就是放到页面中去。根据不同的条件,我们可以改变加载的用户控件!
其实原理就是masterpage的原理。这个masterpage会在vs2005中提供,但是现在也可以实现。
在我的项目中就用到:
masterpage就四个类,其中容器就动态加载用户控件。这种功能在vs2005中将无处不在。
下面简单介绍一下动态加载叶面组件:
我们只需要改变用户组件的地址就可以动态改变加载的用户组件了。
在程序中动态改变skinpath就可以了。
组件源码如下:
using system;
//using system.drawing;
using system.collections;
using system.collections.specialized;
using system.web;
using system.web.ui;
using system.web.ui.webcontrols;
using system.componentmodel;
using system.io;
using system.web.security;
using region.components;
namespace region.controls {
[parsechildren(true)]
/// <summary>
/// 页面组件,从用户组件获取
/// </summary>
public abstract class skinnedcontrol : webcontrol, inamingcontainer {
string skinfilename = null;
string skinname = null;
string skinpath;
// string returnurl = null;
/// <summary>
/// 添加子组件
/// </summary>
protected override void createchildcontrols() {
if(skinpath == null || skinpath == "" || skinpath.trim() == "")
return ;
control skin;
skin = loadskin();
initializeskin(skin);
controls.add(skin);
}
/// <summary>
/// 获取摸板组件
/// </summary>
/// <returns>组件</returns>
protected control loadskin()
{
control skin;
try
{
skin = page.loadcontrol(skinpath);
}
catch (filenotfoundexception)
{
throw new exception("找不到文件:[ " + skinpath + " ] .");
}
return skin;
}
/// <summary>
/// 初始化组建摸板
/// </summary>
/// <param name="skin">组件</param>
protected abstract void initializeskin(control skin);
/// <summary>
/// 用户组件名称
/// </summary>
public string skinfilename
{
get
{
return skinfilename;
}
set
{
skinfilename = value;
}
}
/// <summary>
/// 组件名称
/// </summary>
protected string skinname
{
get
{
return skinname;
}
set
{
skinname = value;
}
}
/// <summary>
/// 用户组件相对路径及组件名称
/// </summary>
public string skinpath
{
get
{
return skinpath;
}
set
{
skinpath = value;
skinfilename = value.trimstart('/');
}
}
}
}
比如我的一个应用:
switch (context.pageid)
{
case "1_1" :
base.skinpath = "~/themes/signmanager/termlist.ascx";
break ;
case "1_1_1" :
base.skinpath = "~/themes/signmanager/termedit.ascx";
break ;
case "1_2" :
base.skinpath = "~/themes/signmanager/memberlist.ascx";
break ;
case "1_2_1" :
base.skinpath = "~/themes/signmanager/memberedit.ascx";
break ;
case "2_1" :
base.skinpath = "~/themes/signmanager/cardsend.ascx";
break ;
case "3_1" :
base.skinpath = "~/themes/signmanager/membernoedit.ascx";
break ;
case "4_1" :
base.skinpath = "~/themes/acountedit.ascx";
break ;
default :
base.skinpath = "";
break;
}
基于组建的开发,我们可省去叶面上很多重复性的地方。只需在重复叶面的地方引用组件就可以了
比如:
这样我们就可以 以用户组件为元素,组件不同的叶面。叶面也可以重用!