七:理解控件的运行机制(例:基于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名称空间
目录
相关文章
|
4月前
|
开发框架 前端开发 C#
使用WPF开发自定义用户控件,以及实现相关自定义事件的处理
使用WPF开发自定义用户控件,以及实现相关自定义事件的处理
|
C# 容器
WPF框架下,窗体的嵌套显示
WPF框架下,窗体的嵌套显示
227 0
|
前端开发 C# 图形学
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
Wpf开发过程中,最经常使用的功能之一,就是用户控件(UserControl)了。用户控件可以用于开发用户自己的控件进行使用,甚至可以用于打造一套属于自己的UI框架。依赖属性(DependencyProperty)是为用户控件提供可支持双向绑定的必备技巧之一,同样用处也非常广泛。
954 0
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象
原文:Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象 原创文章,如需转载,请注明出处。   最近在一直研究Silverlight下的数据绑定控件,发现有这样两个接口IEditableObject 和IEditableCollectionView,记录一下结论,欢迎交流指正。
871 0
|
C#
WPF xaml中列表依赖属性的定义
原文:WPF xaml中列表依赖属性的定义 列表内容属性 如上图,是一个列表标题排序控件,我们需要定义一个标题列表,从而让调用方可以自由的设置标题信息。 在自定义控件时,会遇到列表依赖属性,那么该如何定义呢? 下面是错误的定义方式: 1 /// 2 /// 标识 的依赖项属性。
1106 0
|
前端开发 C#
WPF 介绍一种在MVVM模式下弹出子窗体的方式
原文:WPF 介绍一种在MVVM模式下弹出子窗体的方式 主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来。
2358 0
|
前端开发 C# 容器
WPF 中动态创建和删除控件
原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.
1164 0
|
C#
WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问
原文:WPF关于控件 父级控件,子级控件,控件模板中的控件,等之间的相互访问 1,在菜单中访问 弹出菜单的控件 var mi = sender as MenuItem;//菜单条目 MenuItem var cm = mi.
991 0
|
C#
WPF查找子控件和父控件方法
原文:WPF查找子控件和父控件方法 public List GetChildObjects(DependencyObject obj, string name) where T : FrameworkElement { Dependen...
1413 0