没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2007-10-26 11:11:09.000|阅读 1266 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
复合控件是什么呢?说白了就是包含了两个或多个已存在控件的集合,复用现有的那些控件。并且来进行生成,回传处理等等。例如,复合控件就像一个团队,它包括了各种各样的人才。通过这个团队来完成所需任务(这里的生成,回传处理等)
复合控件是一个功能强大的工具,可以生成丰富复杂的组件,这些组件产生自活动对象的相互作用而不是某些字符串生成器对象的标记输出。复合控件以构成控件树的形式呈现,每个构成控件都有其自己的生命周期和事件,并且所有构成控件都联合构成一个全新的 API,并按需要尽可能地抽象化
实现目的:简化控件开发,通过复合在一起,可以把许多任务委托到子控件上。就用上一例说事吧,组合团队的目的是干什么,大家都知道是为了高效的工作,集大家之所长,复合控件也如此,提高开发效率,将各个子控件的能力综合发挥。例如说。当控件包含处理回传数据控件 textbox 时,可以不必实现 IPostBackDataHandler 接口,同理,包含 Button 时,不必实现 IPostBackEventHandler 接口。
实现复合控件的要点:复合控件可以派生自 control 类或 WebControl 类,但在.net2.0中通常派生于 CompositeControl 类,这与.net 1.x环境下开发复合控件有些不同,在.net 1.x 中,复合控件必须实现 INamingContainer 接口,CompositeControl 类表述:
public abstract class CompositeControl : WebControl, INamingContainer, ICompositeControlDesignerAccessor
{
}
CompositeControl 类是一个抽象类,为自定义控件提供命名容器和控件设计器功能,该自定义包含全部子控件或使用其他控件功能。
此类实现了 INamingContainer 接口,该接口没有任何方法,为什么要继承此接口呢?
答案是:它会使页面在控件下创建一个新的命保范围,当实现该接口时,控件包含的任何子控件的表示符,保证页面中确定是唯一的。例如,如果页面上有两个 gridview 控件,第一个 gridview 的子控件和第二个 gridview 子控件会有不同的唯一标表示符。
事例:就如我们团队有一个团队号(001)[复合控件 ID],个人标识(suiqi)[指子控件 ID],当我们在团队的标识通常为001-suiqi 。
开发复合控件不得不去说说两个方法,一个是 CreateChildControls 方法,一个是 EnsureChildControls 方法。
先说一下 CreateChildControls 方法:CreateChildControls 方法来对子控件进行实例化、初始化、并把这些子控件添加到控件树中.
但一定不能在构造器或 OnInit 方法中执行该逻辑. 必须在 CreateChildControls 方法中创建子控件,而不是在诸如实例化或初始化这样的特定阶段创建,这样可以在控件生命周期中任何需要的时候来创建子控件.当创建一个复合控件且由其子控件来处理回传数据时,这样做特别重要.
再详解一下 EnsureChildControls 方法。该方法为了确保子控件在代码访问它们之前创建好了,该方法来创建军子控件,控件实现中的任何需要访问子控件代码必须先调用 EnsureChildControls 方法,例如,页面用来定位子控件的 FindControl 方法的默认实现,就先调用了 EnsureChildControls 方法.注意,如果子控件没有在控件生命周期中的预先成阶段之前被创建,那么它们会在这个时候根据要求创建.这是因为在 PreRender 方法的默认实现中调用了所有其 Visible 属性值为 true 的控件的 EnsureChildcontrols 方法。
我们知道它的作用,但还要了解为什么,什么时候调用 EnsureChildControls 的。
什么时候被调用:在 PreRender 过程中页面会自动调用 EnsureChildControls,这个方法就会自动调用 CreateChildControls 方法重新建立控件内容。
protected virtual void EnsureChildControls()
{
if (!this.ChildControlsCreated && !this.flags[0x100])
{
this.ChildControlsCreated = true;
}
}
我们先举一个例一个,假如我们要开发一个 ShowList 类,它有一个字串符属性 Text.我们在 ShowList 类中添加这样一个属性 ShowTitle
Private ShowList _sl;
Public string ShowTitle
{
get{ return _sl.Text; }
set{ _sl.Text=value}
}
当我们在 CreateChildControls 时实例化一个_sl时,这个代码将抛出空指针异常,这个问题是我们在设计器试图设置 ShowTitle 值引起的。
在设计器中设置属性将在运行时被设置,也在调用 CreateChildControls 方法之前被调用,如果某些属性在你调用 CreateChildControl 之前被设置,在.net 引擎将实现如下代码:
YourControl newControl=new YourControl();
Newcontrol.ShowTitle="this will cause a null reference";
ParentControl.Controls.Add(newControl);
在创建子控件时,任何时候被初始化,你应该在你的属性访问器中加入一条 EnsureChildControls.还可以这样做:
Private ShowList _sl=new ShowList();
Public string ShowTitle
{
get{ return _sl.Text; }
set{ _sl.Text=value}
}
如果你在 CreateChildControls 方法,设置 ShowTitle 值时,这个值将有一个默认的 Text 值,当创建一个控件时,加上 EnsureChildControls() 确保其被创建
Private ShowList _sl;
Public string ShowTitle
{
get{EnsureChildcontrols();
return _sl.Text; }
set{ EnsureChildcontrols();
_sl.Text=value}
}
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:csdn面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号