没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2006-03-10 13:20:00.000|阅读 1148 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
适用于:
Microsoft Visual Studio 2005
Microsoft ASP.NET 2.0
数据源控件
摘要:本文是介绍数据源控件的系列文章中的第一篇。在本文中,Nikhil Kothari 将着重介绍数据源控件的基本知识,以及在设计这些控件时必须牢记的问题。
单击此处可下载本文中引用的代码示例。
引言 | |
示例 |
本文最初出现在 Nihkil 的博客(英文)中;您可以在此处参加讨论。
数据源控件是 Microsoft Visual Studio 2005 中引入的一种新型服务器控件,它们是数据绑定体系结构的一个关键部分,能够通过数据绑定控件来提供声明性编程模型和自动数据绑定行为。本文及此系列中的后续几篇文章将介绍实现数据源控件的核心内容。
简而言之,数据源控件概括了一个数据存储和可以针对所包含的数据执行的一些操作。DataBound 控件通过其 DataSourceID 属性与一个数据源控件相关联。大多数传统的数据存储要么是表格格式,要么是分层的,数据源控件也相应地分为两类。在此要介绍的是表格格式的数据源控件。
数据源控件自身并不能发挥多大作用;所有逻辑都封装在 DataSourceView 派生的类中。至少有一个 DataSourceView 必须实现检索(即 SELECT)一组行的功能。它可以提供修改数据(即 INSERT、UPDATE 和 DELETE)的功能(可选)。数据绑定控件可通过各种 Can??? 属性来检查启用功能集。数据源控件本身只是一个或多个唯一命名视图的容器。依据惯例,默认视图可以按其名称进行访问,也可以为空。不同视图之间是否存在关系或者存在怎样的关系可以根据每个数据源控件的实现情况来进行适当的定义。例如,某个数据源控件可能会通过不同的视图对同一个数据提供不同的经筛选的视图,或者可能会在辅助视图中提供一组子行。可使用数据绑定控件的 DataMember 属性来选择某个特殊的视图(如果该数据源控件提供了多个视图)。请注意,Whidbey 中的所有内置数据源控件目前都不提供多个视图。
最后再介绍一点内容。数据源控件(及其视图)会实现两组 API。第一组 API 是就四种常用的数据操作而定义的一个抽象界面,以常规方式从任一数据绑定控件中使用。第二组是可选的,它使用其表示的域或数据存储方面的术语来定义,通常被强类型化,且面向应用程序开发人员。
在这些文章中,将实现一个 WeatherDataSource,它将针对由 weather.com(英文)提供的 REST(英文)XML API 来工作,以便根据邮政编码来检索天气信息。通常会首先实现派生的数据源控件。
public class WeatherDataSource : DataSourceControl { public static readonly string CurrentConditionsViewName = "CurrentConditions"; private WeatherDataSourceView _currentConditionsView; private WeatherDataSourceView CurrentConditionsView { get { if (_currentConditionsView == null) { _currentConditionsView = new WeatherDataSourceView(this, CurrentConditionsViewName); } return _currentConditionsView; } } public string ZipCode { get { string s = (string)ViewState["ZipCode"]; return (s != null) ? s : String.Empty; } set { if (String.Compare(value, ZipCode, StringComparison.Ordinal) != 0) { ViewState["ZipCode"] = value; CurrentConditionsView.RaiseChangedEvent(); } } } protected override DataSourceView GetView(string viewName) { if (String.IsNullOrEmpty(viewName) || (String.Compare(viewName, CurrentConditionsViewName, StringComparison.OrdinalIgnoreCase) == 0)) { return CurrentConditionsView; } throw new ArgumentOutOfRangeException("viewName"); } protected override ICollection GetViewNames() { return new string[] { CurrentConditionsViewName }; } public Weather GetWeather() { return CurrentConditionView.GetWeather(); } }
如您所见,基本的理念是实现 GetView 以返回一个命名视图实例,以及实现 GetViewNames 以返回可用视图集。
在此选择从 DataSourceControl 中派生。有一点是不易察觉的,事实上数据绑定控件要查找 IDataSource 界面,而 DataSource 控件通过实现 GetView 和 GetViewNames 来实现该界面。之所以需要界面是为了使数据源控件能够既是表格格式又是分层的(如果可能的话),在这种情况下从主要模型中派生并将另一个模型作为界面来实现)。其次,还允许在各种方案中转换其他控件,以使数据源的容量加倍。
另外还要注意公共 ZipCode 属性和返回强类型化 Weather 对象的 GetWeather 方法。此 API 适合于页面开发人员。页面开发人员无需考虑 DataSourceControl 和 DataSourceView。
下一步是实现数据源视图本身。此特定示例仅提供了 SELECT 级功能(这只是最低要求,也是在此方案中唯一有用的功能)。
private sealed class WeatherDataSourceView : DataSourceView { private WeatherDataSource _owner; public WeatherDataSourceView(WeatherDataSource owner, string viewName) : base(owner, viewName) { _owner = owner; } protected override IEnumerable ExecuteSelect( DataSourceSelectArguments arguments) { arguments.RaiseUnsupportedCapabilitiesError(this); Weather weatherObject = GetWeather(); return new Weather[] { weatherObject }; } internal Weather GetWeather() { string zipCode = _owner.ZipCode; if (zipCode.Length == 0) { throw new InvalidOperationException(); } WeatherService weatherService = new WeatherService(zipCode); return weatherService.GetWeather(); } internal void RaiseChangedEvent() { OnDataSourceViewChanged(EventArgs.Empty); } }
默认情况下,DataSourceView 类从诸如 CanUpdate 等的属性返回 false,而从 Update 和相关方法抛出 NotSupportedException。在此,在 WeatherDataSourceView 中唯一需要做的就是替代抽象的 ExecuteSelect 方法,返回包含“选定”天气数据的 IEnumerable。在实现过程中,使用了帮助程序 WeatherService 类,该类仅使用 WebRequest 对象来查询 weather.com(英文),方法是使用所选的邮政编码(这没什么特别的)。
您可能注意到了,ExecuteSelect 被标记为受保护。数据绑定控件实际调用的是在回拨中传递的公共(和密封)Select 方法。Select 的实现会调用 ExecuteSelect,并调用回拨与得到的 IEnumerable 实例。这种模式非常古怪。这其中有一个原因,此系列随后的文章中将会加以说明。请稍候...
下面是该用法的示例:
Zip Code: <asp:TextBox runat="server" id="zipCodeTextBox" /> <asp:Button runat="server" onclick="OnLookupButtonClick" Text="查找" /> <hr /> <asp:FormView runat="server" DataSourceID="weatherDS"> <ItemTemplate> <asp:Label runat="server" Text='<%# Eval("Temperature", "当前温度是 {0}。") %>' /> </ItemTemplate> </asp:FormView> <nk:WeatherDataSource runat="server" id="weatherDS" ZipCode="98052" /> <script runat="server"> private void OnLookupButtonClick(object sender, EventArgs e) { weatherDS.ZipCode = zipCodeTextBox.Text.Trim(); } </script>
此代码设置了邮政编码来响应用户输入,这会使数据源发出更改通知,从而使绑定的 FormView 控件执行数据绑定并更改显示。
现在,数据访问代码就被封装在数据源控件中。此外,通过此模型,weather.com(英文)能够发布一个组件,该组件还可以封装特定于其服务的详细信息。但愿它会好用。此外,抽象的数据源界面允许 FormView 仅针对天气数据进行工作。
在下一篇文章中,将增强数据源控件的功能,使其能够自动处理用来查询数据的筛选值(即邮政编码)的更改。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至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号