惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
A
About on SuperTechFans
Vercel News
Vercel News
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
S
SegmentFault 最新的问题
V
Visual Studio Blog
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
美团技术团队

博客园 - 零点时刻

一千万条数据数据搜索问题! 嵌套DataGrid,中如何添加删除事件?(望能暂时放一下,谢谢了!) 嵌套DataGrid,中如何添加删除事件? 计算机类资源网:http://www.3human.com/ 互动形式 用户可以上传资料 今天心情有点郁闷! 动态加载用户控件的组件!(二) (转) 动态加载用户控件的组件!(四) Asp.Net Forums研究文章集合(收藏) 【MasterPages实用技巧】为模板增加前端控制①——自动生成页面标题 【MasterPages实用技巧】使用MasterPages实现Web窗体模板 CS研究笔记-缓存 (转) Community Server专题四:HttpHandler Community Server专题八:MemberRole之Membership (转) 主板故障的分析和诊断 c# arraylist functions http://www.metabuilders.com/ 的MasterPages 控件可以多重嵌套 自定义控件主题使用研究 MasterPages(转载) 我的野外拍摄
动态加载用户控件的组件!(转)
零点时刻 · 2006-04-05 · via 博客园 - 零点时刻

我们写用户控件的目的就是放到页面中去。根据不同的条件,我们可以改变加载的用户控件!

其实原理就是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;
   }

基于组建的开发,我们可省去叶面上很多重复性的地方。只需在重复叶面的地方引用组件就可以了

比如:

这样我们就可以 以用户组件为元素,组件不同的叶面。叶面也可以重用!

<%@ Register TagPrefix="Region" Namespace="Region.Controls" Assembly="Region.Controls" %><%@ Register TagPrefix="Region" Namespace="Region.Controls" Assembly="Region.Controls" %><%@ Register TagPrefix="Region" Namespace="Region.Controls" Assembly="Region.Controls" %><%@ Register TagPrefix="igtbl" Namespace="Infragistics.WebUI.UltraWebGrid" Assembly="Infragistics.WebUI.UltraWebGrid.v3" %><%@ Page %><%@ Register TagPrefix="igtbl" Namespace="Infragistics.WebUI.UltraWebGrid" Assembly="Infragistics.WebUI.UltraWebGrid.v3" %><%@ Page %><%@ Register TagPrefix="igtbl" Namespace="Infragistics.WebUI.UltraWebGrid" Assembly="Infragistics.WebUI.UltraWebGrid.v3" %><%@ Page %>

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=60677

[点击此处收藏本文]   发表于 2004年08月04日 1:11 PM