借助控件本身的Render()实现DesignTimeHtml的生成

原创 2004年09月16日 13:27:00
续上文http://http://www.cnblogs.com/piglikefly/posts/40707.aspx

ControlDesigner中,DesignTimeHtml的Get流程

先来个简单的Control

None.gifusing System;
None.gif
using System.Web.UI;
None.gif
using System.Web.UI.Design;
None.gif
using System.Web.UI.WebControls;
None.gif
using System.Drawing;
None.gif
using System.Drawing.Design ;
None.gif
using System.ComponentModel;
None.gif
None.gif
namespace Flying.Pig.WebControl
ExpandedBlockStart.gif

           [
           Designer("Flying.Pig.WebControl.SimpleControlDesigner"),
           ]
InBlock.gif    
public class SimpleControl: Control
ExpandedSubBlockStart.gif    
{
InBlock.gif        
protected override void Render(HtmlTextWriter writer)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
base.Render (writer);  // 进程监视时设置断点
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public class SimpleControlDesigner : ControlDesigner
ExpandedSubBlockStart.gif    
{
InBlock.gif        
public override string GetDesignTimeHtml()
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return base.GetDesignTimeHtml ();  // 进程监视时设置断点
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}


显然,这个Control什么都做不了。写它的目的是为了追踪System.Web.UI.Design.ControlDesigner.GetDesignTimeHtml()究竟做了什么事。

编译->放到工具箱->启动另一个IDE->创建一个Web应用程序->回到控件编辑的IDE->启动进程监视->设置断点(断点位置见代码)->回到Web应用程序IDE->把SimpleControl扔到Webform1里

然后你发现了什么?对,没错,DesignTimeHtml的Get流程:
首先,IDE检查SimpleControlDesigner的GetDesignTimeHtml(),
然后根据SimpleControlDesigner.GetDesignTimeHtml()指示,调用base.GetDesignTimeHtml(),也就是System.Web.UI.Design.ControlDesigner的GetDesignTimeHtml()
那么ControlDesigner的GetDesignTimeHtml()做了什么呢?原来它和运行时刻一样(其实还是有一些区别的,我以后再详细解释),搞了一个HtmlTextWriter,请求SimpleControl.Render()生成Html,以便在IDE里显示。

至此,我们可以发现,除了自己一行行的拼凑外,也可以让控件本身的Render()来生成DesignTimeHtml。

抛弃GetDesignTimeHtml()

现在来做个不需要实现GetDesignTimeHtml()方法,或者连ControlDesigner都不用,却能提供丰富灵活的DesignTime呈现的WebControl

None.gifusing System;
None.gif
using System.Web.UI;
None.gif
using System.Web.UI.Design;
None.gif
using System.Web.UI.WebControls;
None.gif
using System.Drawing;
None.gif
using System.Drawing.Design ;
None.gif
using System.ComponentModel;
None.gif
None.gif
namespace Flying.Pig.WebControls
ExpandedBlockStart.gif
{
InBlock.gif    
public class SimpleControl: WebControl
ExpandedSubBlockStart.gif    
{
InBlock.gif        
private Label label;
InBlock.gif
InBlock.gif        
public SimpleControl()
ExpandedSubBlockStart.gif        
{
InBlock.gif            Text 
= "SimpleControl";
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public string Text
ExpandedSubBlockStart.gif        
{
InBlock.gif            
get
ExpandedSubBlockStart.gif            
{
InBlock.gif                EnsureChildControls();
InBlock.gif                
return label.Text;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set
ExpandedSubBlockStart.gif            
{
InBlock.gif                EnsureChildControls();
InBlock.gif                label.Text 
= value;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected override void CreateChildControls()
ExpandedSubBlockStart.gif        
{
InBlock.gif            Controls.Clear();
InBlock.gif
InBlock.gif            label 
= new Label();
InBlock.gif            Controls.Add(label);
InBlock.gif            
base.CreateChildControls ();
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

下面是SimpleControl的设计时及运行时的效果,

设计时:
1.JPG

图中SimpleControl的属性设置为

<cc1:SimpleControl 
  id="SimpleControl2" 
  runat="server" 
  style
="Z-INDEX: 101; LEFT: 32px; POSITION: absolute; TOP: 32px"
  Text="我的SimpleControl"
 
Font-Size="10.5pt"
  Width="120px"
  Height="128px" 
  BackColor
="Linen"
  BorderWidth
="1px"
 
Font-Bold="True"
>
</
cc1:SimpleControl>

运行效果:

2.JPG


子控件的样式处理

再来个稍复杂点的控件 CaptionText。

None.gifusing System;
None.gif
using System.Web.UI;
None.gif
using System.Web.UI.Design;
None.gif
using System.Web.UI.WebControls;
None.gif
using System.Drawing;
None.gif
using System.Drawing.Design ;
None.gif
using System.ComponentModel;
None.gif
None.gif
namespace Flying.Pig.WebControls
ExpandedBlockStart.gif
{
InBlock.gif    
public class CaptionTextBox: WebControl
ExpandedSubBlockStart.gif    
{
InBlock.gif        
private Label label;
InBlock.gif        
private TextBox textBox;
InBlock.gif        
private Table table;
InBlock.gif
InBlock.gif        
public CaptionTextBox()
ExpandedSubBlockStart.gif        
{
InBlock.gif             Caption 
= "Caption";
InBlock.gif            Text 
= "Text";
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public string Caption
ExpandedSubBlockStart.gif        
{
InBlock.gif            
get
ExpandedSubBlockStart.gif            
{
InBlock.gif                EnsureChildControls();
InBlock.gif                
return label.Text;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set
ExpandedSubBlockStart.gif            
{
InBlock.gif                EnsureChildControls();
InBlock.gif                label.Text 
= value;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public string Text
ExpandedSubBlockStart.gif        
{
InBlock.gif            
get
ExpandedSubBlockStart.gif            
{
InBlock.gif                EnsureChildControls();
InBlock.gif                
return textBox.Text;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set
ExpandedSubBlockStart.gif            
{
InBlock.gif                EnsureChildControls();
InBlock.gif                textBox.Text 
= value;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// Render前的预处理。
InBlock.gif        
/// 在这个控件的预处理是把控件样式应用到子控件。
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        private void DoPreRender()
ExpandedSubBlockStart.gif        
{
InBlock.gif            EnsureChildControls();
InBlock.gif
InBlock.gif            
// 重置子控件样式
InBlock.gif
            table.ControlStyle.Reset();
InBlock.gif            textBox.ControlStyle.Reset();
InBlock.gif            label.ControlStyle.Reset();
InBlock.gif
InBlock.gif            table.ApplyStyle(ControlStyle);
InBlock.gif
InBlock.gif            
// 对于label和text只应用控件的字体样式
InBlock.gif
            textBox.Font.MergeWith(ControlStyle.Font);
InBlock.gif            label.Font.MergeWith(ControlStyle.Font);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected override void CreateChildControls()
ExpandedSubBlockStart.gif        
{
InBlock.gif            Controls.Clear();
InBlock.gif
InBlock.gif            label 
= new Label();
InBlock.gif            textBox 
= new TextBox();
InBlock.gif
InBlock.gif            table 
= new Table();
InBlock.gif            TableRow row 
= new TableRow();
InBlock.gif            row.Cells.Add(
new TableCell());
InBlock.gif            row.Cells.Add(
new TableCell());
InBlock.gif            row.Cells[
0].Controls.Add(label);
InBlock.gif            row.Cells[
1].Controls.Add(textBox);
InBlock.gif            table.Rows.Add(row);
InBlock.gif            
InBlock.gif
InBlock.gif            Controls.Add(table);
InBlock.gif            
base.CreateChildControls ();
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected override void OnPreRender(EventArgs e)
ExpandedSubBlockStart.gif        
{
InBlock.gif            DoPreRender();
InBlock.gif            
base.OnPreRender (e);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected override void Render(HtmlTextWriter writer)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
if (Page != null && Page.Site != null && Page.Site.DesignMode)
ExpandedSubBlockStart.gif            
{
InBlock.gif                
// 由于DesignMode下的Render过程不调用OnPreRender,所以需对诸如样式之类的属性进行处理。
InBlock.gif
                DoPreRender();        
ExpandedSubBlockEnd.gif            }

InBlock.gif            
base.Render (writer);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}


设计时效果:

3.JPG

图中控件的属性为

None.gif<cc1:CaptionTextBox 
None.gif    
id="CaptionTextBox1" 
None.gif    style
="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 16px"
None.gif    runat
="server" 
None.gif    Width
="320px" 
None.gif    Caption
="姓名:" 
None.gif    Text
="朱爱飞" 
None.gif    Font-Size
="10.5pt" 
None.gif    BackColor
="PeachPuff" 
None.gif    Height
="72px">
None.gif
</cc1:CaptionTextBox>
None.gif

运行时效果
4.JPG

CaptionText 演示在设计模式下,对嵌套子控件的样式处理,详情参见代码中的Render及DoPreRender方法。

今天是头一次以Blog的方式写心得,再加上我原本就是个思路不太清楚的,所以表达的很乱。见谅见谅。

借助控件本身的Render()实现DesignTimeHtml的生成

先来个简单的Control using System; using System.Web.UI; using System.Web.UI.Design; using System.Web....
  • zhdd1234
  • zhdd1234
  • 2012年03月06日 14:48
  • 490

实现两个变量的互换(不借助第三个变量)

变量的互换常见于数组排序算法中,当判断两个数组元素需要互换时,将创建一个临时变量来共同完成互换,临时变量的创建增加了系统资源的消耗,如果需要互换的是两个整型类型的变量,那么可以使用更高效的方法。  ...
  • u014482758
  • u014482758
  • 2016年02月15日 20:38
  • 660

回溯与栈如何进行深层理解

回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。  用回溯算法解决问题的一般步骤为:   一、定义一个解空间,它包含...
  • sysusr
  • sysusr
  • 2011年03月06日 21:17
  • 448

js实现的tooltip简单小组件

tooltip主要是根据鼠标的移动到相应的文字上面,下面出现提示小浮动层效果,主要是用jquery来实现,代码下:var $win = $(window);//默认的参数 var default_o...
  • yilanyoumeng3
  • yilanyoumeng3
  • 2016年09月08日 16:53
  • 2386

不借助第三个变量实现两个数的交换

假设两个数为和y,类型相同。 方法1,算术运算(加减): x=x+y; //x暂存两数之和,当两数符相同时可能出现溢出的情况,后面有改进方法 y=x-...
  • HandsomeHong
  • HandsomeHong
  • 2017年05月14日 12:12
  • 312

借助栈实现单链表逆置

 这是C语言标准版吧,不涉及C++中的&引用.代码:#include #include #include #define OK 1 #define ERROR 0 typ...
  • SunshineDabby
  • SunshineDabby
  • 2011年03月21日 23:07
  • 2871

JAVA不借助第三个变量实现两个变量交换的思考

网上存在三种方法:   1) 算术运算 简单来说,就是通过+和-运算来实现。代码如下: int a,b; a=10;b=12; a=b-a;   //a=2;b=12 b=b-a; ...
  • sinolzeng
  • sinolzeng
  • 2014年12月15日 17:38
  • 1321

动态代理之CGLib

动态代理之CGLib jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。 jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。 总的来说...
  • qq_34622600
  • qq_34622600
  • 2017年06月07日 13:52
  • 150

在不借助第三方变量情况下实现两个变量的交换(借助于异或运算)

下面首先来看一个问题。 假设存在两个int型变量a和b,那么如何实现两个变量值的交换呢。 通常我们的做法,也是最容易想到的做法就是通过定义一个第三方变量,然后借助于该变量来实现变量值的交换。 方...
  • Xi__Yuan
  • Xi__Yuan
  • 2016年11月22日 12:59
  • 1153

JAVA中三种随机数产生

转载: 关于Java中的Random()函数 今天在做Java练习的时候注意到了Java里面的一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做...
  • u012940983
  • u012940983
  • 2014年07月27日 10:50
  • 435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:借助控件本身的Render()实现DesignTimeHtml的生成
举报原因:
原因补充:

(最多只允许输入30个字)