七:理解控件的运行机制(例:基于CompositeControl命名空间的控件)

简介: 组合控件与WebControl控件的事件和属性相差不大组合控件,顾名思义就是把一些控件组合起来形成一个控件这个控件将包含这些控件称为他的子控件CompositeControl类实现了INameContainer接口这样使得复合控件下的子控件都根据各自的层级关系生成唯一的客户端标识不至于产生重复的ID组合控件比较重要的方法是:1.

组合控件与WebControl控件的事件和属性相差不大
组合控件,顾名思义就是把一些控件组合起来形成一个控件
这个控件将包含这些控件称为他的子控件

CompositeControl类实现了INameContainer接口
这样使得复合控件下的子控件都根据各自的层级关系生成唯一的客户端标识
不至于产生重复的ID

组合控件比较重要的方法是:
1.EnsureChildControls
此方法判断属性ChildControlsCreated是否为true
如果不是将执行下面的事件
2.CreateChildControls
此方法创建并生成组合控件下的所有子控件
此方法执行完后应该设置ChildControlsCreated属性为true
避免重复调用CreateChildControls

我写了一个生成组合控件的类
但是这个类里没有对子控件进行组织

using  System;
using  System.Collections.Generic;
using  System.Web;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Text;
using  System.ComponentModel;

namespace  hellowControl
{
    
public   class  HellowControl:CompositeControl
    {
        
// 继承的类可以重写protected变量
         protected  TextBox _input;
        
protected  RegularExpressionValidator _regvalidator;
        
protected  RequiredFieldValidator _rqrvalidatator;
        
protected   override  HtmlTextWriterTag TagKey
        {
            
get
            {
                
return  HtmlTextWriterTag.Div;
            }
        }
        
// 在此方法中创建子控件
         protected   override   void  CreateChildControls()
        {
            
// 必须先清除控件
            
// 假设一个请求就是一个线程,那么这个线程创建了子控件
            Controls.Clear();
            _input 
=   new  TextBox();
            _input.ID 
=   " mytxt " ;

            _rqrvalidatator 
=   new  RequiredFieldValidator();
            _rqrvalidatator.ID 
=   " myrequire " ;
            _rqrvalidatator.ErrorMessage 
=   " 内容为空 " ;
            _rqrvalidatator.Display 
=  ValidatorDisplay.Dynamic;
            _rqrvalidatator.ControlToValidate 
=  _input.ID;

            _regvalidator 
=   new  RegularExpressionValidator();
            _regvalidator.ID 
=   " myExpression " ;
            _regvalidator.Display 
=  ValidatorDisplay.Dynamic;
            _regvalidator.ErrorMessage 
=   " 格式错误 " ;
            _regvalidator.ValidationExpression 
=   @" \w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* " ;
            _regvalidator.ControlToValidate 
=  _input.ID;

            
this .Controls.Add(_input);
            
this .Controls.Add(_rqrvalidatator);
            
this .Controls.Add(_regvalidator);

            
// 确认子控件已经创建,避免重复创建
            ChildControlsCreated  =   true ;
        }
    }    
}
我重写了这个类
在我重写这个类的子类中,我对上面创建的子控件进行了组织
using  System;
using  System.Collections.Generic;
using  System.Web;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Text;

namespace  hellowControl
{
    
public   class  SunHellowControl : HellowControl
    {
        
protected   override  System.Web.UI.HtmlTextWriterTag TagKey
        {
            
get
            {
                
return  HtmlTextWriterTag.Table;
            }
        }
        
// 重写control类的RenderContents来组织父类中创建的控件
         protected   override   void  RenderContents(HtmlTextWriter writer)
        {
            EnsureChildControls();
// 如果ChildControlsCreated不为true则调用CreateChildControls
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.AddAttribute(HtmlTextWriterAttribute.Align, 
" center " );
            writer.AddAttribute(HtmlTextWriterAttribute.Width, 
" 360px " );
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.Write(
" your name: " );
            writer.RenderEndTag();

            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            _input.RenderControl(writer);
// 输出第一子个控件
            writer.RenderEndTag();

            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            _rqrvalidatator.RenderControl(writer);
            _regvalidator.RenderControl(writer);
            writer.RenderEndTag();

            writer.RenderEndTag();

        }
    }
}
这样控件就按我们的要求输出了

我发现我的工具箱针对这个控件的图标是一个齿轮
我想把他换成我自己的个性化ICO图标
1:做一个16*16象素和控件同名的bmp图片,放在和控件相同的目录下
2:属性设置成"嵌入的资源",重新选择项...

如果想让控件拖到aspx页面上去的时候是这样的形式
<asp:SunHellowControl ID="SunHellowControl1" runat="server" />
那么我们可以在控件的AssemblyInfo.cs文件中
插入
[assembly: TagPrefix("hellowControl", "asp")]
第一个参数是类库的名称空间,第二个就不用说了
注意AssemblyInfo.cs要引用System.Web.UI名称空间
目录
相关文章
|
11月前
|
关系型数据库 MySQL C#
C# winform 一个窗体需要调用自定义用户控件的控件名称
给用户控件ucQRCode增加属性: //二维码图片 private PictureBox _pictureBoxFSHLQrCode; public PictureBox PictureBoxFSHLQrCode {   get { return _pictureBoxFSHLQrCode; }   set { this.pictureBoxFSHLQrCode = value; } } 在Form1窗体直接调用即可: ucQRCode uQRCode=new ucQRCode(); ucQRCode.PictureBoxFSHLQrCode.属性= 要复制或传给用户控件上的控件的值
61 0
|
API 图形学
Winform控件优化之自定义控件的本质【从圆角控件看自定义的本质,Region区域无法反锯齿的问题】
自定义控件的本质只有两点:重绘控件Region区域(圆角、多边形、图片等),这是整个控件的真实范围;重绘图形,在原有Region范围内,重绘不同的图形(圆角、多边形、图片等)作为背景......
545 0
Winform控件优化之自定义控件的本质【从圆角控件看自定义的本质,Region区域无法反锯齿的问题】
|
1月前
|
开发框架 前端开发 JavaScript
使用Winform开发自定义用户控件,以及实现相关自定义事件的处理
使用Winform开发自定义用户控件,以及实现相关自定义事件的处理
|
1月前
|
开发框架 前端开发 C#
使用WPF开发自定义用户控件,以及实现相关自定义事件的处理
使用WPF开发自定义用户控件,以及实现相关自定义事件的处理
|
C# 容器
WPF框架下,窗体的嵌套显示
WPF框架下,窗体的嵌套显示
208 0
|
前端开发 C# 图形学
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
Wpf开发过程中,最经常使用的功能之一,就是用户控件(UserControl)了。用户控件可以用于开发用户自己的控件进行使用,甚至可以用于打造一套属于自己的UI框架。依赖属性(DependencyProperty)是为用户控件提供可支持双向绑定的必备技巧之一,同样用处也非常广泛。
886 0
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
|
C#
WPF整理-为控件添加自定义附加属性
原文:WPF整理-为控件添加自定义附加属性 附加属性,大家都不陌生,最常见的是Canvas.Left/Canvas.Top,类似的也有Grid.Row/Grid.Column等附加属性。举个最常见的例子 需要说明的是并不是所有的附加属性都是元素放进去后才会有附加效果,上面的例子只是刚好是这种错觉的巧合情况,Grid.Row也属于这种巧合。
2107 0
|
XML C# 数据格式
[UWP]为附加属性和依赖属性自定义代码段(兼容UWP和WPF)
原文:[UWP]为附加属性和依赖属性自定义代码段(兼容UWP和WPF) 1. 前言 之前介绍过依赖属性和附加属性的代码段,这两个代码段我用了很多年,一直都帮了我很多。不过这两个代码段我也多年没修改过,Resharper老是提示我生成的代码可以修改,它这么有诚意,这次就只好从了它,顺便简单介绍下怎么自定义代码段。
752 0
|
C#
WPF xaml中列表依赖属性的定义
原文:WPF xaml中列表依赖属性的定义 列表内容属性 如上图,是一个列表标题排序控件,我们需要定义一个标题列表,从而让调用方可以自由的设置标题信息。 在自定义控件时,会遇到列表依赖属性,那么该如何定义呢? 下面是错误的定义方式: 1 /// 2 /// 标识 的依赖项属性。
1097 0
|
前端开发 C#
WPF 介绍一种在MVVM模式下弹出子窗体的方式
原文:WPF 介绍一种在MVVM模式下弹出子窗体的方式 主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来。
2311 0