没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2010-07-07 12:02:33.000|阅读 672 次
概述:本文主要讲解ASP.NET模板控件开发的经验总结,希望对你有所帮助。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
ASP.NET模板控件1.ASP.NET内置的模板控件,了解模板控件
如下图,以下为ASP.NET内置的模板控件
上图的控件一方面是模板控件,另一方面又是数据绑定控件.这里我们暂且不讨论如何实现数据绑定.
使用上面控件的话,应该熟悉控件存在着不同的模板,如下图Repeater控件的模板类型.
在不同模板内你可以定义控件显示内容会呈现不同效果.典型的运用就是GridView,其呈现代码会是一个表格代码,而Repeater则是自定义的.其实其是内部已经实现了的,暂且先不管这些.下面一步步看下来如何实现.
ASP.NET模板控件2.实现模板控件
2.1简单实现模板控件(静态模板)
(1)模板控件为特殊的复合控件,你还是需要实现INamingContainer接口,因为在模板属性的内容是为子控件集合添加到模板控件中,为保证控件具有唯一标识符.其实现将在CreateChildControls方法中创建子控件.
ASP.NET中可以直接继续CompositeControl就可
(2)定义控件属性
模板属性为System.Web.UI.ITemplate 接口,此接口有一InstantiateIn 方法 将在下面分析
上一篇我们说明了控件内部属性和控件的区别,模板并非控件而是属性,我们在属性浏览器中并未看到此属性,是因为我们为其加了元数据,作为内部属性使用
定义模板属性方法如下
//声明变量 private ITemplate _itemTemplate;
//属性 [Browsable(false)] [TemplateContainer(typeof(Article))]
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate ItemTemplate
{
get {
return _itemTemplate;
}
set {
_itemTemplate = value;
}
}
这里我们认识到了一个TemplateContainer元数据,其与容器控件关联起来.Article为默认其自身控件,即默认将自身控件作为容器控件.
(3).重写CreateChildControls方法
此方法我们以前已认识过了,主要是为控件添加子控件
protected override void CreateChildControls()
{
_itemTemplate.InstantiateIn(this);
}
这次我们要做的重点是认识ITemplate接口的InstantiateIn 方法,方法有一个Control参数,其为子控件和模板定义了一个容器控件(此处为其自身控件,下面看页面代码).如GridView和DataList控件都实现了自定义的容器控件.Repeater则是完全自定义的.这里暂且默认实现
ASP.NET模板控件实现代码
在模板内拖了一个label控件
﹤custom:Article id="Article1" Runat="server"﹥
﹤ItemTemplate﹥
﹤asp:Label ID="Label1" runat="server" Text="Label"﹥﹤/asp:Label﹥
﹤/ItemTemplate﹥
﹤/custom:Article﹥
OK,你可以看一下效果了,当然你可以定义多个模板然后在多个不同模板内添加内容.我们来看下其控件树内容,如下图
子控件有一个Label控件,非控件内容则以LiteralControl呈现.
2.2实现动态模板
当我们使用DataList控件时,往往在模板中动态的绑定一些数据,获取的这些数据则是ITemplate接口的InstantiateIn 方法中的容器控件.下面我们为控件定义属性,然后通过DataBind()方法和数据绑定表达式获取数据
我们先先定义三个属性
页面代码,注意要用DataBind()方法
void Page_Load()
{
Article1.Title = "Creating Templated Databound Controls";
Article1.Author = "Stephen Walther";
Article1.Contents = "Blah, blah, blah, blah"
Article1.DataBind();
}
通过Container数据绑定表达式获取容器对象属性,此处容器对象为默认的Article
如下实现
﹤custom:Article id="Article1" Runat="server"﹥
﹤ItemTemplate﹥
﹤asp:Label ID="Label1" runat="server" Text="Label"﹥﹤/asp:Label﹥
﹤%# Container.Title%﹥﹤br /﹥
﹤%# Container.Author %﹥﹤br /﹥
﹤%# Container.Contents %﹥﹤br /﹥
﹤/ItemTemplate﹥
﹤/custom:Article﹥
好了,到这里你就实现了一个简单的动态模板控件了.
2.3实现默认模板
在购书网站上我们常常看到由于图书太多的情况下,管理人员未能将图书封面发布到网站上,这时此书可能出现默认的图片"尚为此书添加图书封面"
在一个具有模板的控件里,如果你未为控件添加模板属性的话,你可以通过实现默认模板来实现默认效果.
(1)那你第一步要做的就是定义一个自定义ASP.NET模板控件.此模板需要实现ITemplate接口,实现InstantiateIn方法.看一下典型实现,如下代码
public class ArticleDefaultTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
Label lblTitle = new Label();
lblTitle.DataBinding += new EventHandler(lblTitle_DataBinding);
Label lblAuthor = new Label();
lblAuthor.DataBinding += new EventHandler(lblAuthor_DataBinding);
Label lblContents = new Label();
lblContents.DataBinding += new EventHandler(lblContents_DataBinding);
container.Controls.Add(lblTitle);
container.Controls.Add(new LiteralControl("﹤br /﹥"));
container.Controls.Add(lblAuthor);
container.Controls.Add(new LiteralControl("﹤br /﹥"));
container.Controls.Add(lblContents);
}
void lblTitle_DataBinding(object sender, EventArgs e)
{
Label lblTitle = (Label)sender;
ArticleWithDefault container = (ArticleWithDefault)lblTitle.NamingContainer;
lblTitle.Text = container.Title;
}
void lblAuthor_DataBinding(object sender, EventArgs e)
{
Label lblAuthor = (Label)sender;
ArticleWithDefault container = (ArticleWithDefault)lblAuthor.NamingContainer;
lblAuthor.Text = container.Author;
}
void lblContents_DataBinding(object sender, EventArgs e)
{
Label lblContents = (Label)sender;
ArticleWithDefault container = (ArticleWithDefault)lblContents.NamingContainer;
lblContents.Text = container.Contents;
}
}
在InstantiateIn方法中,定义了默认控件,并实现了默认绑定.在各自的数据绑定事件里通过容器控件(默认容器控件为ArticleWithDefault,此处还是没自定义容器控件,下面会介绍)的NamingContainer属性获取控件ID值.然后对控件进行赋值.
(2)重写CreateChildControls方法
当未定义模板属性时,则实现默认模板
protected override void CreateChildControls()
{
if (_itemTemplate == null)
_itemTemplate = new ArticleDefaultTemplate();
_itemTemplate.InstantiateIn(this); }
(3)页面代码
下面实现效果跟2.2的定义的模板控件效果一样,这里只为说明默认模板的使用方法
void Page_Load()
{
ArticleWithDefault1.Title = "Creating Templated Databound Controls";
ArticleWithDefault1.Author = "Stephen Walther";
ArticleWithDefault1.Contents = "Blah, blah, blah, blah";
ArticleWithDefault1.DataBind();
}
﹤custom:ArticleWithDefault
id="ArticleWithDefault1"
Runat="server" /﹥ 2.4ASP.NET模板控件之实现自定义容器控件
上面我已经多次注明容器控件为默认自身控件,你可以通过自定义容器控件
GridView控件会自动把数据以表格形式呈现,DataList控件有DataListItem ,Repeater则有RepeaterItem.
这些控件实现数据绑定后,通常不是显示一条数据的,其控件都有一个Items属性,其表示项集合.
每项数据都在其Item里面,看一下DataList绑定数据以后的控件树
我们常常会需要在模板控件里以以下方式来获取模板内部控件
如在DataList控件中
protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
{
e.Item.FindControl("");
DataList1.Items[0].BackColor = System.Drawing.Color.Red;
}
通过此方法我们可以处理一些特殊的列和行.为实现上面效果,我们也可以为ASP.NET模板控件自定义容器控件
(1)自定义容器控件类
注意需要实现IDataItemContainer接口,就如DataList一样,其绑定的数据不可能是一条的.
public class ProductItem : WebControl, IDataItemContainer
{
private string _name;
private decimal _price;
public string Name
{
get { return _name; }
set { _name = value; }
}
public decimal Price
{
get { return _price; }
set { _price = value; }
}
public object DataItem
{
get
{
return this;
}
}
public int DataItemIndex
{
get { return 0;
}
}
public int DisplayIndex
{
get { return 0;
}
}
}
然后在主控件中如下实现
private ProductItem _item;
public string Name
{
get
{
EnsureChildControls();
return _item.Name;
}
set
{
EnsureChildControls();
_item.Name = value;
}
}
public Decimal Price
{
get
{
EnsureChildControls();
return _item.Price;
}
set
{
EnsureChildControls();
_item.Price = value;
}
}
(2)ASP.NET模板控件之用TemplateContainer与模板属性关联起来
[TemplateContainer(typeof(ProductItem))]
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate ItemTemplate
{
get {
return _itemTemplate;
}
set
{
_itemTemplate = value;
}
}
(3)重写CreateChildControls方法
注意了,此处模板的InstantiateIn方法不再是this了,而是自定义容器控件了,再用数据绑定表达式访问的将是ProductItem的数据(即自定义容器控件的数据)
protected override void CreateChildControls()
{
_item = new ProductItem();
_itemTemplate.InstantiateIn(_item);
Controls.Add(_item);
}
(4)页面代码
void Page_Load()
{
Product1.Name = "Laptop Computer";
Product1.Price = 1254.12m;
Product1.DataBind();
}
﹤custom:Product
id="Product1"
Runat="Server"﹥
﹤ItemTemplate﹥
Name: ﹤%# Eval("Name") %﹥
﹤br /﹥
Price: ﹤%# Eval("Price", "{0:c}") %﹥
﹤/ItemTemplate﹥
﹤/custom:Product﹥
上面以Eval来绑定数据,也可以用Container表达式,如下图,其类型为ProductItem
注意:当不是数据绑定控件时,则不能用Eval绑定语法,如上面的几个例子.大家可以测试一下.
ASP.NET模板控件的相关内容就向你介绍到这里,希望对你了解ASP.NET模板控件有所帮助。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号