asp.net控件开发基础(20)

示例代码
        上面我们讨论了数据绑定控件的做法,但都未涉及到asp.net2.0中数据源控件的用法,让用惯了数据源控件的人可能感觉不适应。这次我们就开始讨论在asp.net2.0中,我们该如何重新定义数据绑定控件。我一直在想,是先讨论数据源控件呢,还是先讨论数据绑定控件,两者是密不可分的。在看下文之前,我想大家应该对asp.net2.0中的数据源控件使用的简易性非常熟悉了。记得园子的开源项目NBear也为大家提供了数据源控件。个人认为数据源控件和数据绑定控件之间存在着一些约定关系,学习还当从易到难,这里就假定我们对内置的数据源已经能够熟练的使用了。这里就看看如果定义新的数据绑定控件.

一.数据绑定控件新做法

1. 第一种为纯代码做法,这种做法比较的烦琐

2.新做法数据绑定控件与数据源控件结合.不同之处则是不需要写重复代码, 如

None.gif        <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateColumns="False">
None.gif            
<Columns>
None.gif                
<asp:BoundField DataField="CompanyName" HeaderText="CompanyName" SortExpression="CompanyName" />
None.gif                
<asp:BoundField DataField="ContactName" HeaderText="ContactName" SortExpression="ContactName" />
None.gif            
</Columns>
None.gif        
</asp:GridView>
None.gif    
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString2 %>"
None.gif            SelectCommand
="SELECT [CompanyName], [ContactName] FROM [Customers]"></asp:SqlDataSource>

上面的做法是asp.net2.0里面新增的,如果你没有学过asp.net1.1而直接学2.0的话,上面的写法是非常简单的,没有写一行的代码.

这样的做法可能会让人产生以下几点看法

(1)初学者认为asp.net真的很简单,是的很简单,在简单的同时你也该意识到数据源控件为你做了重复的工作,快速开发的同时你是否该了解下上面的做法是如何实现的

(2)接触过.net一段时间的人则会认为DataSource数据源控件只是小儿科,大项目怎么可以这么做,对其不放心,还是自己手动写代码比较放心-_-.

数据源控件好不好用这里不必讨论,但我想大多数人还是向其靠拢的.

二.数据绑定控件相同机制

数据绑定控件需要数据源

(1)在没有数据源控件之前,数据绑定控件需要先给DataDource属性赋值获取数据源,然后执行DataBind()方法
(2)在数据源控件出现之后,数据绑定控件仍然需要数据源,只不过方式发生了变化,不是通过DataDource属性直接的获取,而是间接的通过数据源控件获取,然后帮你自动执行了DataBind()方法

所以这里需要注意的是,当设置DataDourceID的时候,不需要再调用DataBind()方法,两种方法不可同时使用

站在使用者的角度,唯一的变化也就是给我们两种数据绑定做法的选择.偷懒的我们当然愿意选择后一种,一切交给数据源控件为我们处理.

三.数据绑定控件新的起点

上篇我们讲到过BaseDataList .1.1中的旧的数据绑定控件从此抽象类中继承下来,而2.0中新的数据绑定控件,并没有这么做,而是从BaseDataBoundControl类重新开始,以此为基础.net为我们定义了一些比较实用的类.当然在.net2.0中,BaseDataList类也提供了DataDourceID属性,但微软也很明确的表示让我们弃用DataGrid,使用GridView . 暂时我们先不去想为什么,只有了解以后,我们才能去比较

在微软的MSDN上,早就有篇文章介绍ASP.NET 2.0 和数据绑定控件:新的角度,新的做法  大家可以看看

这次我们只需要了解两个基类




两个类都为抽象类BaseDataBoundControl类定义了两个抽象方法PerformSelectValidateDataSource由子类实现.

虽然你不需要对这两个类的实现了解很多,但你需要知道两个类为你做了什么.

1.BaseDataBoundControl类大致做了如下工作

定义了基本的DataSource和DataSourceID基本属性,我们称为数据源标识

其主要提供了两种不同做法的实现机制

(1)定义了DataSource,则会验证数据源的正确性即ValidateDataSource方法(此过程由子类完成),还需要手动调用DataBind方法
(2)定义了DataSourceID,则会自动调用DataBind方法

当定义了以上其中一个属性时,这个类便帮你做了以下执行过程,所以你还需要了解以下成员

OnDataPropertyChanged 方法(当定义了数据源标识或其发生变化后)
                         |
RequiresDataBinding方法(确定要开始调用DataBind方法)
                         |
EnsureDataBound 方法(判断如若定义DataSourceID属性,则执行DataBind方法,所以此步骤是关键点)
                         |
DataBind 方法(在次方法中执行了PerformSelect方法检索数据并把数据绑定到控件,此过程由子类完成)

2.DataBoundControl 类开始真正的与数据源控件开始交互,请看下面主要实现
(1)GetDataSource方法(检索与数据绑定控件关联的IDataSource接口,即从DataSourceID属性属性)
                         |
(2)GetData方法(从数据源控件检索数据源视图,这个方法是数据的主要来源)
                         |
(3)PerformSelect 方法(GetData方法中检索数据,然后调用PerformDataBinding方法)
                         |
(4)PerformDataBinding方法(将检索到的数据绑定到控件上,此方法为空实现,留给子类实现)

注意点:如果未设置DataSourceID属性,(1)(2)步骤可以省去,从(3)开始必然会执行.
一般情况下,简单的数据绑定控件留给我们做的只剩下第4个步骤PerformDataBinding方法,你只需要重写这个方法,获取控件要呈现的数据就完成了.其他的事情就不需要你操心了.说了这么多,还是来看看示例代码吧.

四.示例

代码来自asp.net2.0揭密,我把重复的定义删除了只留下PerformDataBinding方法

1.从DataBoundControl继承

None.gif    public class TextBoxSet : DataBoundControl
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
ExpandedBlockEnd.gif    }

2.定义属性

ContractedBlock.gifExpandedBlockStart.gif
None.gif        private IList alBoxSet;
None.gif        
public IList BoxSet
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (null == alBoxSet)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    alBoxSet 
= new ArrayList();
ExpandedSubBlockEnd.gif                }

InBlock.gif                
return alBoxSet;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif        
public string DataTextField
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
object o = ViewState["DataTextField"];
InBlock.gif                
return ((o == null? string.Empty : (string)o);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                ViewState[
"DataTextField"= value;
InBlock.gif                
if (Initialized)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    OnDataPropertyChanged();
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

3.方法实现

None.gif       protected override void PerformDataBinding(IEnumerable retrievedData)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{
InBlock.gif            
if (retrievedData != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                
foreach (object dataItem in retrievedData)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif
InBlock.gif                    TextBox box 
= new TextBox();                   
InBlock.gif                    
if (DataTextField.Length > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        box.Text 
= DataBinder.GetPropertyValue(dataItem,
InBlock.gif                            DataTextField, 
null);
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        PropertyDescriptorCollection props 
=
InBlock.gif                            TypeDescriptor.GetProperties(dataItem);
InBlock.gif                        box.Text 
= String.Empty;
InBlock.gif                        
if (props.Count >= 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
dot.gif{
InBlock.gif                            
if (null != props[0].GetValue(dataItem))
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
dot.gif{
InBlock.gif                                box.Text 
= props[0].GetValue(dataItem).ToString();
ExpandedSubBlockEnd.gif                            }

ExpandedSubBlockEnd.gif                        }

ExpandedSubBlockEnd.gif                    }

InBlock.gif
InBlock.gif                    BoxSet.Add(box);
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif        
protected override void Render(HtmlTextWriter writer)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif{           
InBlock.gif            
if (BoxSet.Count <= 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
if (Page != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Page.VerifyRenderingInServerForm(
this);
ExpandedSubBlockEnd.gif            }

InBlock.gif            writer.RenderBeginTag(HtmlTextWriterTag.Ul);
InBlock.gif            
foreach (object item in BoxSet)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif                TextBox box 
= (TextBox)item;
InBlock.gif                writer.WriteBeginTag(
"li");
InBlock.gif                writer.Write(
">");
InBlock.gif                writer.WriteBeginTag(
"input");
InBlock.gif                writer.WriteAttribute(
"type""text");
InBlock.gif                writer.WriteAttribute(
"value", box.Text);
InBlock.gif                writer.Write(
">");
InBlock.gif                writer.WriteEndTag(
"input");
InBlock.gif                writer.WriteEndTag(
"li");
ExpandedSubBlockEnd.gif            }

InBlock.gif            writer.RenderEndTag();
ExpandedBlockEnd.gif        }

接下来你便可以使用了

None.gif<aspDemo:TextBoxSet ID="TextBoxSet1" runat="server" DataSourceID="SqlDataSource1"
None.gif            DataTextField
="CompanyName" />
None.gif        
None.gif    
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString2 %>"
None.gif            SelectCommand
="SELECT [CompanyName], [ContactName] FROM [Customers]"></asp:SqlDataSource>

本次的示例代码比较简单,对于继承的两个基类,我们还需要多了解下.对其属性和方法心理有个概念他们的工作是获取数据,我们的工作是呈现数据,具体如何获取数据,我们以后来看数据源控件的实现方法.

以上纯属经验之谈,说错了还请大家指正-_-

转载于:https://www.cnblogs.com/Clingingboy/archive/2007/03/12/DataBoundControl.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win7 Ubuntu13.04互通(win7下用vbox安装Ubuntu)

2019独角兽企业重金招聘Python工程师标准>>> <p>VirtualBox设置</p> <p>采用的是Bridgehost方式</p> <p><a href"http://static.oschina.net/uploads/img/201310/11213732_gHMq.jpg"><img style"background-…

后端接口重定向_接口自动化面试题,建议收藏!

1、get和post的区别&#xff1f;l http是上层请求协议&#xff0c;主要定义了服务端和客户端的交互规格&#xff0c;底层都是tcp/ip协议l Get会把参数附在url之后&#xff0c;用&#xff1f;分割&#xff0c;&连接不同参数&#xff0c;Get获取资源&#xff0c;post会把参数…

期货市场计算机分析指南在线,期货市场计算机分析指南

39.60定价&#xff1a;55.00(7.2折)(美)勒博&#xff0c;(美)卢卡斯 著&#xff0c;何苗 译/2012-04-01《期货市场计算机分析指南》花费了作者大量的心血&#xff0c;这从书中的内容就可以看出。我所读过的有关技术分析的大部分书未能给各种技巧及随后的交易方法打下坚实的基础…

吃货都是怎么给自己找理由的? | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;看得我都饿了↓ ↓ ↓

用SharpZipLib来压缩和解压文件 --zt

from:http://www.cnblogs.com/zhangweiguo3984/archive/2007/03/15/314333.html#6756341.建立工程&#xff0c;添加引用&#xff0c;添加SharpZipLib.dll2.建立压缩和解压类CompressionFile.cs添加如下代码usingSystem;usingSystem.IO;usingICSharpCode.SharpZipLib.Zip;usingI…

vue 给取data值_web前端教程分享Vue相关面试题

Vue是一套构建用户界面的渐进式框架&#xff0c;具有简单易用、性能好、前后端分离等优势&#xff0c;是web前端工程师工作的好帮手&#xff0c;也是企业选拔人才时考察的重点技能。接下来就给大家分享一些Vue相关的面试题&#xff0c;帮助大家提升竞争力。你对Vue生命周期的理…

.NET Core with 微服务 - Consul 配置中心

上一次我们介绍了Elastic APM组件。这一次我们继续介绍微服务相关组件配置中心的使用方法。本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大&#xff0c;还是让我爱不起来。因为前面我们已经介绍了使用Consul 做为服务注册发现的组件&#xff0c;那…

程序员最爱说的十句口头禅。。 | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅1、别更新了学不动了。2、我不会修电脑&#xff0c;谢谢。3、听说今晚不用加班。4、是你的网络有问题。5、清一下缓存再试试6、扫码提需求&#xff0c;谢谢。7、换一台设备试试看。8、保证今晚十点上线。9、键盘给你&#xff0c;你来写…

.NET 6 新特性 System.Text.Json 中的 Writeable DOM

.NET 6 新特性 System.Text.Json 中的 Writeable DOM 特性Intro在 .NET 6 Preview 4 中&#xff0c;微软加入了 JSON Node 的支持&#xff0c;我们可以动态的编辑一个 JSON 文档&#xff0c;一个可以修改的 JSON 文档&#xff0c;就像 Newtonsoft.Json 里的 JToken&#xff0c;…

ArcGISServer10安装与地图发布

1.安装ArcGISServer10前先启动IIS&#xff0c;并打开IIS管理器界面&#xff0c;检查是否已经安装好。2.新建一个自己的站点打开Internet信息服务&#xff08;IIS&#xff09;管理器&#xff0c;右击左侧的网站列表&#xff0c;选择——添加网站&#xff0c;如下图所示&#xff…

电影特效用到什么计算机知识,后期影视特效处理知识普及

电影特效作为电影产业中不可或缺的元素之一&#xff0c;为电影的发展做出了巨大的贡献。今天小编主要给大家分享后期影视特效处理知识普及&#xff0c;希望对你们有帮助!影视特效改变电影制作的方式在目前的电影制作过程中&#xff0c;从分镜头剧本开始&#xff0c;特效的理念已…

通达信版弘历软件指标_通达信软件指标编写基础教程,10个指标源码祝你股市一帆风顺...

一、基本函数HHV&#xff08;X,N&#xff09; N日内X的最高价LLV&#xff08;X,N&#xff09; N日内X的最低价VOL 成交量AND 和&#xff0c;表示同时满足MA&#xff08;X,N&#xff09; 移动平均线&#xff0c;5日均线可以写作MA&#xff08;CLOSE&#xff0c;5&#xff09;&am…

魔方内部长啥样?三维动画展示其结构,谁发明的真是个天才

全世界只有3.14 % 的人关注了青少年数学之旅魔方&#xff0c;英文名为Rubiks Cube&#xff0c;又叫鲁比克方块&#xff0c;最早是由匈牙利布达佩斯建筑学院厄尔诺鲁比克&#xff08;又称作厄尔诺卢比克&#xff09;教授于1974年发明的。魔方竞速是一项手部极限运动。咱们平时看…

Hello Blazor:(2)集成Tailwind CSS续——nuget包方式

前段时间&#xff0c;写了一篇“Blazor如何集成Tailwind CSS”的文章。但是操作起来比较麻烦&#xff0c;又是命令行&#xff0c;又是要修改一大堆配置。后来&#xff0c;我又找到一个更简单的方法。实现方式新建Blazor项目&#xff0c;然后引用nuget包BamButz.MSBuild.Tailwin…

30屏幕参数_顶级屏幕加持,一加8系列核心配置、屏幕参数官方公布

昨天&#xff0c;一加8系列官宣将于4月16日进行线上发布。届时&#xff0c;全新的一加8系列将正式到来。随着官宣的开启&#xff0c;一加手机也开始了新机的预热。参数配置上&#xff0c;一加官方剧透称&#xff0c;一加8系列全系标配骁龙865 5G旗舰级移动平台&#xff0c;全系…

陕西科技大学18计算机调剂,2018年陕西科技大学考研调剂信息公布

2018考研复试交流群(进群领内部资料) 5764338402018年陕西科技大学考研调剂信息公布2018年考研成绩查询接近尾声&#xff0c;部分成绩不太理想的考生可能会考虑考研调剂&#xff0c;为了方便考生&#xff0c;中公考研小编为大家整理了2018年陕西科技大学考研调剂信息公布&#…

垃圾软件!动不动就扣费!| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅一、二、三、四、五、&#xff08;图源网络&#xff0c;侵权删&#xff09;我怀疑有人偷窥我生活↓ ↓ ↓

WPF实现统计图(饼图仿LiveCharts)

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;一、PieControl.cs 代码如下 using System.Collections.Obje…

计算机实践教程采莲趣事,计算机基础作业采莲趣事

精品文档 . 忽然想起采莲的事情来了。采莲是江南的旧俗&#xff0c;似乎很早就有&#xff0c;而六朝时为盛&#xff1b;从诗歌里可以约略知道。采莲的是少年的女子&#xff0c;她们是荡着小船&#xff0c;唱着艳歌去的。采莲人不用说很多&#xff0c;还有看采莲的人。那是一个热…

那些曾经拥有的最大快乐,都是好奇心的结果

▲ 点击查看对于孩子们来说&#xff0c;强烈的好奇心和求知欲&#xff0c;是一种本能。在他们懵懵懂懂长大的过程中&#xff0c;总是对周围的世界充满着各种各样的疑问&#xff1a;“叶子为什么是绿色的&#xff1f;”“为什么花朵有那么多种颜色&#xff1f;”“蚂蚁为什么能…