没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2006-03-14 09:20:00.000|阅读 1488 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
适用于:
Microsoft Visual Studio 2005
Microsoft ASP.NET 2.0
数据源控件
摘要:本文是介绍数据源控件的系列文章中的第二篇。在本文中,Nikhil 着重介绍如何添加支持以向针对控件的查询添加参数。
单击此处可下载本文中引用的代码示例。
引言 | |
示例 |
本文最初出现在 Nihkil 的博客(英文)中;您可以在此处参加讨论。
数据源控件需要使用参数值来指定需要选择哪些数据,或者指定如何修改数据以及修改什么数据。通常情况下,页面包含一些 UI,以定义那些必须在选择操作中使用的参数,而数据绑定控件提供了参数值来进行插入、更新和删除操作。但是,在任意一种情况下,都可能同时出现两种现象。在第 1 部分中,数据源控件揭示了 ZipCode 属性,该属性可进行声明性设置,或者以编码来设置以响应用户操作。参数被设计为以声明性(且可扩展)的方式来完成此方案。
Parameter 基类代表一个通用参数。Microsoft Visual Studio 2005 提供了诸如 QueryStringParameter 之类的参数,以便将数据从查询字符串参数请求到数据源中。另一个非常有用的参数是 ControlParameter,该参数允许从任一控件属性中请求数据。如果内置参数类型不能满足您的要求,则您可以定义自己的参数类型。这样您就可以使页面与粘接代码不相关,而是将该代码整齐地封装在参数实现中。
除了从不同的源中请求值,这些参数还可以跟踪值的更改情况,并通知这些更改的所属数据源,进而引发数据源更改通知,最终在数据绑定控件中触发数据绑定操作。简而言之,这就是使用 ControlParameters 时,主要的声明性详细方案所依据的原理。
在此将向 WeatherDataSource 添加参数功能,然后进一步阐述。
public class WeatherDataSource : DataSourceControl { public static readonly string ZipCodeParameterName = "ZipCode"; ... private ParameterCollection _parameters; private ParameterCollection Parameters { get { if (_parameters == null) { _parameters = new ParameterCollection(); _parameters.ParametersChanged += new EventHandler(this.OnParametersChanged); if (IsTrackingViewState) { ((IStateManager)_parameters).TrackViewState(); } } return _parameters; } } ... public string GetSelectedZipCode() { if (_parameters != null) { Parameter zipCodeParameter = _parameters[ZipCodeParameterName]; if (zipCodeParameter != null) { IOrderedDictionary parameterValues = _parameters.GetValues(Context, this); return (string)parameterValues[zipCodeParameter.Name]; } } return ZipCode; } protected override void LoadViewState(object state) { object baseState = null; if (state != null) { Pair p = (Pair)state; baseState = p.First; if (p.Second != null) { ((IStateManager)Parameters).LoadViewState(p.Second); } } base.LoadViewState(baseState); } protected override void OnInit(EventArgs e) { Page.LoadComplete += new EventHandler(this.OnPageLoadComplete); } private void OnPageLoadComplete(object sender, EventArgs e) { if (_parameters != null) { _parameters.UpdateValues(Context, this); } } private void OnParametersChanged(object sender, EventArgs e) { CurrentConditionsView.RaiseChangedEvent(); } protected override object SaveViewState() { object baseState = base.SaveViewState(); object parameterState = null; if (_parameters != null) { parameterState = ((IStateManager)_parameters).SaveViewState(); } if ((baseState != null) || (parameterState != null)) { return new Pair(baseState, parameterState); } return null; } protected override void TrackViewState() { base.TrackViewState(); if (_parameters != null) { ((IStateManager)_parameters).TrackViewState(); } } }
Microsoft ASP.NET 提供了 ParameterCollection,您可以完全按原样使用该集合。它同时包含更改跟踪和状态管理功能。您只需相应地调用该集合的 API 来合并这些功能,另外还可以在控件外将该集合揭示为属性。在上述代码中,需要注意的关键点为:
• | 该数据源控件揭示了一个 ParameterCollection 类型的属性,以使开发人员能够添加表示要使用的邮政编码值的参数。如果已经设置了参数,则使用该参数;否则,将使用 ZipCode 属性值。 |
• | 该控件替代了与状态管理相关的方法,以请求 ParameterCollection 中内置的状态管理功能。 |
• | 该控件使用页面生命周期的新 LoadComplete 事件来更新参数值,它通过替代 OnInit 来注册这些值。如果在初始化、回发处理或页面编码(当引发 LoadComplete 时,全部都会发生)期间更改了任何参数的值,则该数据源控件还会注册 ParameterCollection 所引发的 ParametersChanged 事件。与上述情况一样,如果设置了 ZipCode 属性,将会引发更改通知,向数据绑定控件指明它需要再次执行数据绑定操作(随后在 PreRender 期间将会发生此情况)。 |
• | 需要参与生命周期是数据源作为控件(即使是非可视控件)来实现的一个原因。另一个原因是为了使数据绑定控件能够通过使用其 DataSourceID 属性来使用 FindControl,并能够获得基于 INamingContainer 的分层名称领域的益处(这样就能够实现嵌套数据方案,方法是在模板内放置一个数据源控件,并使其在每行中重复一次)。数据源是控件这一事实早已是争论的焦点 - 但愿这能够说明此问题的一些论据。 |
在此 DataSourceView 只需调用 GetSelectedZipCode,而不是直接使用 ZipCode 属性。此外,还更改了数据源视图代码,以便在未选中 ZipCode 的情况下返回 null(而不是抛出异常),这会导致数据绑定控件显示“空”视图。这在通常情况下是一个惯例,但是回顾来看,这应该成为数据源控件语义的一个不可获缺的方面。
private sealed class WeatherDataSourceView : DataSourceView { ... internal Weather GetWeather() { string zipCode = _owner.GetSelectedZipCode(); if (zipCode.Length == 0) { return null; } WeatherService weatherService = new WeatherService(zipCode); return weatherService.GetWeather(); } }
完整的代码就是这个样子。以下是经过更新的用法示例,该示例现在是声明性的。
Zip Code: <asp:TextBox runat="server" id="zipCodeTextBox" /> <asp:Button runat="server" 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"> <Parameters> <asp:ControlParameter Name="ZipCode" ControlID="zipCodeTextBox" /> </Parameters> </nk:WeatherDataSource>
请注意,在标记中并未指定 Text 作为在 ControlParameter 标记上查找的属性。ControlParameter 自动计算出了在未指定属性的情况下要使用的默认属性。它通过检查该类中的 ControlValueAttribute 来实现此目的。TextBox 将 Text 定义为包含其“控件值”的属性。除了传统输入控件之外,此概念还适用于多个控件。例如,GridView 将其 SelectedDataKey 揭示为“控件值”。这是一个新事物,控件开发人员从此以后应该予以考虑,以便与 ControlParameter 更好地进行集成。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至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号