Silverlight 数据验证
- 格式:docx
- 大小:733.21 KB
- 文档页数:25
数据验证(Validation)是界面程序的常见需求,例如使用正则表达式验证用户输入的Email地址是否合法,然后在界面给出错误提示信息。
在Sivlerlight的MVVM模式中,我们在Model和ViewModel可以做Validation,然后需要把Model和ViewModel的Validation 结果和错误信息通知视图(View)。
在WPF中,我们使用IDataErrorInfo,在Silverlight4中,建议使用INotifyDataErrorInfo。
IDataErrorInfo先简单说一下IDataErrorInfo,这个接口实现了简单的数据验证和错误报告功能,只能说聊胜于无吧。
例子:1<TextBox Text="{Binding Path=, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True }"/>INotifyDataErrorInfo这个接口只有Silverlight4以上支持,非常强大,支持一个绑定属性多重错误、异步数据验证、自动通知视图错误信息、ErrorChanged事件、HasErrors属性、GetErrors方法等等。
定义:1publicinterface INotifyDataErrorInfo2 {3bool HasErrors { get; }45event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;67IEnumerable GetErrors(string propertyName);8 }实现这个INotifyDataErrorInfo接口也非常简单,来个简单的例子:1publicclass SimpleModel : INotifyDataErrorInfo2 {3publicevent EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;45private Dictionary<string, List<String>> _errors = new Dictionary<string, List<String>>();67privatestring _accountID = null;89publicstring AccountID10{11get { return _accountID; }12set13{14if (_accountID != value)15{16var propertyName = "AccountID";1718if (string.IsNullOrEmpty(value))19{20if (!_errors.ContainsKey(propertyName))21_errors.Add(propertyName, new List<string>());2223_errors[propertyName].Add("AccountID can't be null or empty"); 24}25else26{27if (_errors.ContainsKey(propertyName))28_errors.Remove(propertyName);29}3031NotifyErrorsChanged(propertyName);3233//Maybe you don't want to set this field to a value if the validation fails34_accountID = value;35}36}3738}3940public System.Collections.IEnumerable GetErrors(string propertyName)41{42if (_errors.ContainsKey(propertyName))43return _errors[propertyName];4445return _errors.Values;46}4748publicbool HasErrors49{50get { return _errors.Count >0; }51}525354privatevoid NotifyErrorsChanged(string propertyName)55{56if (ErrorsChanged != null)57ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));58}59 }异步Validation数据验证和INotifyDataErrorInfo接口这个例子稍微复杂,实现了异步调用WCF RIA Service进行业务逻辑的validation并在ViewModel中把验证的错误提示通知视图,完整的代码下载,需要VS2010和Silverlight环境。
Silverlight 系列课程39讲 Silverlight 调试、错误处理和 调试 错误处理和 异常苏鹏 MVP MSDN 特约讲师下载Webcast好帮手iR iReaper文件大小<=2.5Mb 可按照多种分类方式进行批量下载WMV、MP3、MP4、Zune四种格式Webcast访问iReaper主页: /iReaper h d l i加速企业解决方案部署尽在资源和利益• 用于解决方案开发的集中资源 用于解决方案开发的集中资源:资源包括指向测试工具、开发 资源包括指向测试工具 开发 人员 SDK、技术论坛、联机培训等的链接,微软全球技术支持中 心( (GTSC) )的邮件技术支持。
• 对市场调查的访问权限:您可以使用这些宝贵信息来识别您当 前的客户或未来客户的特定需求。
• 认证徽标计划:该徽标可以向客户证明您所具有的优秀技术。
• 市场营销和销售支持 h OMetro – ISV领航计划最先应用微软最新技术 提升ISV 提升 ISV竞争优势和商业价值 竞争优势和商业价值• Metro 提供了结构化的支持来帮助ISV进行新技术的评估和 部署 部署: Discover – 参与前沿技术培训 – 评估最新的微软技术及产品 Release Learn – 获取微软Beta版产品的技术支持 – 联络全球开发人员和架构师社区 – 与世界级的商务和技术社区分享最先 Develop 部署的经验点击添加MSN机器人小新 为您收听下载MSDN中文网络广播课程加油助力!收听本次课程需具备的条件• 了解 解SilverLight应用基础 应 础 • 了解.NET NET 的错误处理基本原理Level 200内容介绍• • • • 调试概括 试 括 错误处理 处理和引发异常 总结Level 300调试概述• 讨论 Silverlight Tools for Visual Studio 2008 可帮 调试 Silverlight g 的应 的应用程 程 ,它可帮助您调试基于 序。
1.调试WCF相关问题的一般步骤是什么?2.如何使得Silverlight和HTML元素之间进行交互?2.1. 如何从JavaScript调用中可脚本化的方法?2.2. 如何从代码后置调用客户端JavaScript函数?2.3. 如何从代码后置访问HTML元素?3.如何在Visual Studio中调试带有Silverlight 功能的网站中的JavaScript代码?4.如何处理 Out-Of-Browser 相关问题?4.1. 如何检测应用程序是否工作在OOB( Out-Of-Browser)模式?4.2. 如何检测OOB更新?4.3. 如何将HTML元素融入Silverlight应用程序?4.4. OOB模式下如何调用JavaScript访问HTML 元素?4.5. 在Silverlight中如何访问cookie?5.如何调试OOB应用程序?6.在OOB模式下如何得到网络状况?7. 如何将XAML转换为图像?8. 如何使用Perspective 3D?9. 何时并如何使用Isolate Storage?10. 如何使同一页面的2个Silverlight应用程序交互?11. 如何指定安装界面?12. 什么是Element Binding?13. 什么是Binary Xml?14. Silverlight应用程序如何相互交互?15. Silverlight中如何访问本地字体?16. 什么是 Silverlight 导航应用程序(Navigation Application)?========================================== =====================1.调试WCF相关问题的一般步骤是什么?默认情况下,Silverlight使用浏览器HTTP栈。
这种情况下,如果WCF发生了一个错误,它会发送HTTP 404响应码,错误详细信息并不能在Silverlight客户端中被访问到。
FaceLight – Silverlight 4 实时人脸检测本文介绍如何实现一个简单的人脸识别系统在 c# 中使用 Silverlight 4 新网络摄像头功能。
介绍网络摄像头和麦克风 API 是我玩过 Silverlight 4 beta 发布在去年的 PDC 之后的第一件事。
我的意见,是它最酷的功能之一。
你可以做很多好玩的Silverlight 应用程序。
当发布了SLARToolkit,是我终于有时间来实现使用 Silverlight 4 网络摄像头 API 的实时人脸检测。
本文将描述特定大小的皮肤颜色区域网络摄像头快照中的搜索的简单面部识别方法。
这项技术是不是使用作为专业的计算机视觉库如OpenCV和Haar 样功能完善,但它运行实时和大多数网络摄像头方案的作品。
演示应用您需要一个网络摄像头,至少运行示例安装 Silverlight 4 运行库。
现在是可用于Windows和Mac预发布版本。
面部的地区应该会好点亮和背景应在皮肤颜色对比度,以获得最佳效果。
打开示例如何使用您可以启动和停止与网络摄像头, Button,或者您可以从磁盘加载图像,按钮。
使用组合框演示模式从"亮点"改为"图像"。
"突出显示"只是绘制一个红色的椭圆检测到的脸前后"Image"叠加图像面部地区。
猿猴的头是默认图像(图11),但可以通过输入其 URI 在 TextBox 中应用一个不同的图片的。
使用滑块控件可以改变皮肤颜色阈值 YCbCr 颜色空间中的(请参见步骤 2:过滤皮肤颜色)。
(包括重叠的图像)的人脸检测的结果保存到磁盘,按钮。
当您单击时,按钮的第一次了,您需要授予捕捉功能的权限。
此应用程序使用默认 Silverlight 捕获设备。
您可以使用 Silverlight 配置指定默认视频和音频设备。
只是在应用程序上按鼠标右键单击上下文菜单中的"Silverlight"、选择"网络摄像头/麦克风"选项卡来设置它们。
JSON是一种轻量级的数据传输类型,它可以通过序列化把一个简单对象转换为一个简单的字符串,在网络中进行传输,然后在客户端进行反序列化,得到原始对象.功能上和XML差不多,只是它的体积小,在客户端解析方便,所以被广泛使用.我们可以使用Silverlight提供的三个类来完成JSON数据的传递和接收。
它们是:1、DataContractJsonSerializer (位于 System.Runtime.Serialization. Json)2、JsonObject (位于System.Json,将JSON数据流转换成为可读写的对象)3、JsonArray (位于System.Json, 对JSON数据流转换成为JsonObject数组形式,可支持LINQ查询)注:如果要引用System.Runtime.Serialization.Json名空间里的Json,则必须也引用System.ServiceModel,否则Json会无法使用。
在本例中,我们将使用它来进行示例。
下面我们一起来学习在Silverlight中如何从服务器端向客户端传递Json数据。
新建一个Silverlight应用程序。
命名为:SLJson(一)准备工作在这里,我们完成三种情况的Json数据传递。
1、一个Person类(其属性均为简单类型:String类型)2、Customers类,它是Person类的一个List。
3、一个PersonT类(它包含另一个类 Address)我们要传递这三种情况的类对象实例到客户端并显示出来。
所以,在此,我们首先要在服务器端和客户端分别建立上面的三个类。
Person类服务器端代码定义如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Serialization;//要引用System.Runtime.Serializati on.Dll才能使用[DataContract]与[DataMember]属性namespace SLJson.Web{[DataContract]public class Person{[DataMember]public string Name { get; set; }[DataMember]public int Age { get; set; }[DataMember]public string Address { get; set; }}}客户端代码定义如下:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace SLJson{public class Person{public string Name { get; set; }public int Age { get; set; }public string Address { get; set; }}}Customers类服务器端代码定义如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Serialization; //要引用System.Runtime.Serializat ion.Dll才能使用[DataContract]与[DataMember]属性namespace SLJson.Web{[DataContract]public class Customers{[DataMember]public List<Person> Persons { get; set; }}}客户端代码定义如下:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using System.Collections.Generic; //要引入此空间以使用Listnamespace SLJson{public class Customers{public List<Person> Persons { get; set; }}}PersonT类服务器端代码定义如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Serialization;//要引用System.Runtime.Serializati on.Dll才能使用[DataContract]与[DataMember]属性namespace SLJson.Web{[DataContract]public class PersonT{[DataMember]public string Name { get; set; }[DataMember]public int Age { get; set; }[DataMember]public Address Address { get; set; }}}客户端代码定义如下:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace SLJson{public class PersonT{public string Name { get; set; }public int Age { get; set; }public Address Address { get; set; }}}PersonT类内含的Address类服务器端代码定义如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Serialization;//要引用System.Runtime.Serializati on.Dll才能使用[DataContract]与[DataMember]属性namespace SLJson.Web{[DataContract]public class Address{[DataMember]public string country { get; set; }[DataMember]public string city { get; set; }}}客户端代码定义如下:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace SLJson{public class Address{public string country { get; set; }public string city { get; set; }}}至此,我们的应用程序如下图:(二) 实现Json数据的传递。
SilverLight目前已经成为互联网应用当中的终点,其本身具有的巨大市场前景,尤其是提供丰富的网路表示控件方面已经成为了flash的最大竞争对手,几天我们通过一个简单的示例演示如何使用SilverLight创建一个使用数据访问的应用,同时为了配合微软最新的.NET 3.5技术,这个例子还将使用微软的LINQ数据源作为数据集合的基础,使用WCF进行远程的数据访问,从而实现分布式调用。
整个过程共分为5个部分1.创建一个SilverLight应用2.创建一个使用LINQ的数据源映射对象3.创建一个WCF应用4.在SilverLight中添加对WCF的引用5.在SilverLight添加DataGrid数据显示控件1 创建一个SilverLight应用本程序使用Visual Studio 2008中创建新的SilverLight应用。
在Visual Studio 2008中只要安装了SilverLight 2.0 Beta 1的Visual Studio 2008模板即可看到如下图1.1所示的新工程模板,图1.1 新建SilverLight 2.0工程在新建Sl工程的时候有一个选项,就是是否添加的网站作为宿主如下图1.2所示图1.2 选择是否添加网站应用在这里我们为了后面编辑数据库应用服务器,选择添加 2.0的网站,添加之后的工程窗体项目文件如下图1.3所示1.3 添加工程以后的应用界面可以看到Sl被编译成为了一个SilverLightDemo.xap文件,这个文件到底是什么内容呢,我们在这里对它的内容进行解密,首先修改文件后缀为zip之后解压缩,就可以看到文件是把SL运行需要调用的程序打包之后随应用程序提供。
图1.4显示了这几个文件图1.4 SilverLightDemo.xap所包含的文件这些文件除了基本的SL库文件之外还有一个应用程序描述文件,AppMainfest.xaml,这个文件记录了当前应用程序所使用的基本业务逻辑和表示层内容。
WPFSilverlight数据验证方式汇总数据验证一.数据验证方式可以使用以下任一种方式实现验证1.Exception需要将Binding的ValidatesOnExceptions设为true,当访问数据对象的Set访问器并抛出异常时验证不通过2.IDataError绑定到控件并需要实现验证的对象实现该接口,同时需要将Binding的ValidatesOnDataErrors设为true该接口有两个成员:string Error { get; }整个对象的验证错误信息string this[string columnName] { get; }验证时传入属性名获取该字段的验证结果字符串,如果该串为String.Empty或null时则验证通过。
3.DataAnnotations需要引用/doc/608548957.html,ponentModel.Data Annotations.dll使用此方法验证不通过时会引发ValidationException,因此同样需要将Binding的ValidatesOnExceptions设为true将从ValidationAttribute派生的特性置于属性前,然后在Set访问器中调用Validator.ValidateProperty,格式如下:private string _password;[StringLength(6, ErrorMessage="密码不能超过6个字符")]public string Password{get { return _password; }set{Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Password" });_password = value;}}MemberName为属性名,用于获取正确的错误信息。
Silverlight访问MSSQL数据库在银光中国网()有一篇"Silverlight与常用数据库互操作系列"文章,其中介绍了使用Silverlight存取不同数据库的方法和步骤。
但是对于Silverlight存取MS SQL介绍的不够全面,这里我想介绍Silverlight 如何通过WCF访问MSSQL数据库存储过程的。
希望对大家能够有所帮助。
我们要实现,用户输入用户名和密码后,点击登录按钮,传递用户名和密码到服务器端, 通过WCF访问MSSQL数据库,调用存储过程,在服务器端对用户名和密码进行匹配,匹配成功,则返回登录成功,否则,则是失败。
在文章开始前,我们需要做一下准备工作,∙开发环境需求: VS2008 SP1, Silverlight 3 Develop Tools for VS2008 SP1,客户端Silverlight 3 Runtime, MSSQL 2005 SP3 ;∙建立例程数据库 SilverlightDemo,在数据库中建立一个新表 Users,包含以下字段;添加内容到Users表,为了方便起见,密码全部使用明文,在正式项目中,建议对密码字段进行加密使用。
这里,我们验证用户名和密码,有两种简单方式,一是使用存储过程读取用户名和密码,然后在服务器端进行用户名和密码匹配校验,如果查找到匹配数据,则返回登录成功,否则,则是登录失败;二是传用户名和密码到存储过程中,在数据库存储过程中进行判断,使用Select 语句进行查找,对应用户名和密码,如果查找到匹配结果,则返回用户ID,服务器端接收到用户ID,则返回登录成功,否则,则是失败;在本例中,主要是对Silverlight访问数据库进行讲述,所以,对于验证方法,不进行详细描述和讲解,如果有问题,可以留言给我,我们继续讨论,这里,我将使用第一种验证方法。
为此,建立一个简单的存储过程:1CREATE PROCEDURE[dbo].[Login]2 ( @UserName Varchar(30))3AS45Select cUserName, cPassword6From Users7Where cUserName =@UserName89RETURN1011SET NOCOUNT ON在完成上面的准备工作后,开始建立新的Silverlight项目,1. 建立一个新项目"SilverlightDBDemo",2. 在MainPage中建立简单的登录界面,如下:3. 在Web项目中添加新选项4. 添加一个简单的用户信息类Users,作为WCF的契约成员,当我们从数据库中读取信息后,将赋值给该类的契约成员,方便客户端进行调用;VS2008将自动生成Users类代码,在类命名前添加数据契约属性[DataContract()]。
一步一步学Silverlight 2系列(13):数据与通信之WebRequest概述Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF 以及Sockets的支持等一系列新的特性。
《一步一步学Silverlight 2系列》文章带您快速进入Silverli ght 2开发。
本文将简单介绍在Silverlight 2中如何使用WebRequest进行数据的提交和获取。
简单示例在本文中,我们仍然使用在一步一步学Silverlight 2系列(12):数据与通信之WebClient中用过的示例,只不过稍微做一点小的改动,使用WebRequest提交书籍编号数据,并根据书籍号返回价格信息。
最终运行的结果如下图:编写界面布局,XAML如下:在界面加载时绑定书籍列表,关于数据绑定可以参考一步一步学Silverlight 2系列(11):数据绑定。
接下来在SelectionChanged事件中实现用户选择书籍时,我们使用WebRequest提交书籍编号,并且获得价格数据,仍然采用异步模式,提供RequestReady和ResponseReady两个回调函数:实现RequestReady方法,将书籍的编号写入请求流中。
实现ResponseReady方法,显示返回的结果。
最后运行的结果如下:用户选择一本书籍后,将显示其价格:结束语本文简单介绍了在Silverlight 2中如何使用WebRequest提交和获取数据,你可以从这里下载示例程序。
下一篇:一步一步学Silverlight 2系列(14):数据与通信之WCF作者:TerryLee出处:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Silverlight改进总结交流1、Silverlight4新特性●打印API●RichTextArea 富文本控件(支持Paragraph,InlineUIContainer…)●ButtonBase和Hyperlink支持MVVM的ICommand接口●通过WebBrowser控件支持Html内容显示(只支持OOB 的Windowless,不支持输入中文)●Notification 提示框API●WebClient的网络认证●依赖对象绑定●IDataErrorInfo 和异步校验●XAP签名●自定义窗口外观●上下文菜单控件●SLLauncher silent installs2、应用INotifyDataErrorInfo实现异步校验通过Model类继承INotifyDataErrorInfo接口实现异步校验.一个方法public IEnumerable GetErrors(string propertyName)一个属性ErrorList = new Dictionary<string, List<string>>();添加错误列表,并显示到App.LoginedUser.AddError("LoginPassWord", "无效密码");public void AddError(string propName, string error){ErrorList[propName] = new List<string>();ErrorList[propName].Add(error);if (ErrorsChanged != null)ErrorsChanged(this, newDataErrorsChangedEventArgs(propName));}对应的属性和对应的校验提示信息支持TextBox, ComboBox, DatePicker3、WCF分页服务访问定义两个操作契约//返回二进制的数据表///<summary>///分页获取数据集///</summary>///<param name="sql">SQL语句</param>///<param name="startIndex">开始索引</param>///<param name="maxCount">如果是-1则不分页</param>///<param name="parameters">参数</param>///<param name="isStoredProcedure">是否存储过程</param>///<returns></returns>public byte[] ExcuteDataTable(string sql, int start, int size, List<SqlParameterInfo> parameters){…System.Data.DataSet ds = ExcuteDataTable(sql, start * size, size, parameters, false);//记录总的记录数ds.ExtendedProperties.Add("RecordCount", recordCount);var ms = new MemoryStream();//通过C1.C1Zip进行压缩using (var sw = new C1.C1Zip.C1ZStreamWriter(ms))ds.WriteXml(sw, XmlWriteMode.WriteSchema);//ds.WriteXml(ms, XmlWriteMode.WriteSchema);//返回XML的字节数组return ms.ToArray();}//更新数据public string UpdateData(byte[] dtAdded, byte[] dtModified, byte[] dtDeleted, string dataTableName){//对于不同DataRow….UpdateData(dtAdded, DataRowState.Added, transaction);UpdateData(dtModified, DataRowState.Modified, transaction);UpdateData(dtDeleted, DataRowState.Deleted, transaction);mit();….}void UpdateData(byte[] data, DataRowState state, OracleTransaction trans) {if (data == null)return;var ds = new DataSet();var ms = new MemoryStream(data);//通过DataSet的ReadXml方法恢复ds.ReadXml(ms);ds.AcceptChanges();foreach (DataTable dt in ds.Tables){foreach (DataRow dr in dt.Rows){switch (state){case DataRowState.Added:dr.SetAdded();break;case DataRowState.Modified:dr.SetModified();break;case DataRowState.Deleted:dr.Delete();break;}}}//计算总共有多少条记录public int CalculateRecord(string sql){string strCount = string.Format("select count(*) as co from {0}", tableName); }//分页获取数据集public System.Data.DataSet ExcuteDataTable(string sql, int startIndex, int maxCount, List<SqlParameterInfo> parameters, bool isStoredProcedure){...adapter.FillSchema(dt, SchemaType.Source);if (maxCount >0 )//分页处理adapter.Fill(ds, startIndex, maxCount, tableName);else//做分页dapter.Fill(ds);return ds;...}4、Silverlight端数据访问string sqlSel = "select * from 反馈需求记录where 编号=:BH";BasicHttpBinding binding = new BasicHttpBinding();EndpointAddress address = new EndpointAddress(newUri(Application.Current.Host.Source, "/WCFDataService.svc"));binding.MaxReceivedMessageSize = Int32.MaxValue;binding.MaxBufferSize = Int32.MaxValue;binding.SendTimeout = TimeSpan.FromMinutes(10);binding.OpenTimeout = TimeSpan.FromMinutes(10);binding.ReceiveTimeout = TimeSpan.FromMinutes(10);List<ZLBH.SL.App.WCFDataServiceRef.SqlParameterInfo> sqlParas = new List<ZLBH.SL.App.WCFDataServiceRef.SqlParameterInfo>();ZLBH.SL.App.WCFDataServiceRef.SqlParameterInfo sqlParaItem = new ZLBH.SL.App.WCFDataServiceRef.SqlParameterInfo();sqlParaItem.ParameterName = "BH";sqlParaItem.ParameterType = BizFieldType.文本;sqlParaItem.ParameterValue = bh;sqlParas.Add(sqlParaItem);WCFDataServiceRef.WCFDataServiceClient detailclient = new WCFDataServiceRef.WCFDataServiceClient(binding, address);detailclient.ExcuteDataTableCompleted +=delegate(object s,WCFDataServiceRef.ExcuteDataTableCompletedEventArgs e){if (e.Error == null){var ms = new MemoryStream(e.Result);DataTable dt = new DataTable();DataSet _ds = new DataSet();//解压缩using (var zr = new C1.C1Zip.C1ZStreamReader(ms))_ds.ReadXml(zr);dt = _ds.Tables[0];//绑定到DataGridView上this.DetailTab.DataContext =dt.DefaultView.Table.Select().First<DataRow>().GetRowView();}};detailclient.ExcuteDataTableAsync(sqlSel, 0, -1,sqlParas.ToArray());///<summary>///绑定分页///</summary>///<param name="sql"></param>///<param name="pageIndex">当前页索引</param>///<param name="pageSize">分页大小</param>///<param name="pager">分页控件</param>///<param name="selCol">是否有选择列</param>///<param name="grid">要绑定的DataGrid</param>///<param name="parameters"></param>private void BindGrid(string sql, int pageIndex, int pageSize, DataPager pager, bool selCol,Control grid, ZLBH.SL.App.WCFDataServiceRef.SqlParameterInfo[] parameters){var ms = new MemoryStream(e.Result);DataTable dt = new DataTable();DataSet _ds = new DataSet();using (var zr = new C1.C1Zip.C1ZStreamReader(ms))_ds.ReadXml(zr);dt = _ds.Tables[0];if (pager != null){if (pager.PageIndex <= 0){object recordcount;//获得总的行数_ds.ExtendedProperties.TryGetValue("RecordCount", out recordcount);pager.BindSource(Convert.ToInt16(recordcount), 10);//绑定到DataPager的PageIndex事件pager.PageIndexChanged -= (s1, e1) =>{BindGrid(sql, pager.PageIndex, pageSize, pager, selCol,grid, parameters);};pager.PageIndexChanged += (s1, e1) =>{BindGrid(sql, pager.PageIndex, pageSize, pager, selCol,grid, parameters);};}}if(selCol)dt.DefaultView.Table.Columns.Add("选择",typeof(bool)); }5、Silverlight端数据更新string sqlSel = "select * from 反馈需求记录 where 1=2";WCFDataServiceRef.WCFDataServiceClient detailclient = new WCFDataServiceRef.WCFDataServiceClient(binding, address);detailclient.ExcuteDataTableCompleted +=delegate(object s,WCFDataServiceRef.ExcuteDataTableCompletedEventArgs e){if (e.Error == null){var ms = new MemoryStream(e.Result);DataTable dt = new DataTable();DataSet _ds = new DataSet();//获取一个空的数据表结构using (var zr = new C1.C1Zip.C1ZStreamReader(ms))_ds.ReadXml(zr);dt = _ds.Tables[0];dt.TableName = "反馈需求记录";DataRow newRow = dt.NewRow();DataRowView rowView =(DataRowView)newRow.GetRowView();rowView.SetData("ID", Guid.NewGuid().ToString());….rowView.SetData("附件", fjbyte);dt.Rows.Add(newRow);_ds.Tables.Clear();_ds.Tables.Add(dt);//获得相应DataRowState的记录的字节数组值byte[] dtAdded = GetChanges(_ds,DataRowState.Added);byte[] dtModified = GetChanges(_ds,DataRowState.Modified);byte[] dtDeleted = GetChanges(_ds,DataRowState.Deleted);WCFDataServiceRef.WCFDataServiceClientupdateClient = newWCFDataServiceRef.WCFDataServiceClient(binding,address);updateClient.UpdateDataAsync(dtAdded, dtModified, dtDeleted, _ds.Tables[0].TableName);updateClient.UpdateDataCompleted += newEventHandler<UpdateDataCompletedEventArgs>(updateClient_UpdateDataComple ted);}};6、IIS配置支持Silverlight在IIS6.0中,允许 V4.0 Web服务扩展注册如果 没有注册到IIS,在FrameWork4.0目录下运行Aspnet_regiis.exe – i增加对XAP和XAML文件的支持在新建网站的HTTP选项中,选择添加“MIME类型”加入.xaml、.xap、.xbap扩展名.xap application/x-silverlight-app.xaml application/xaml+xml.xbap application/x-ms-xbap允许匿名访问选择Internet来宾账户7、IIS配置支持WCF在FrameWork4.0目录下运行ServiceModelReg.exe -ia8、WCF配置文件设置启动IIS,通过WcfTestClient.exe测试调用服务,或者通过http://webSite/WCF服务.svc 访问测试获取MetaData元数据进行测试。
Silverlight g 系列课程34讲 Silverlight2中的控件数据绑定苏鹏 MVP MSDN 特约讲师点击添加MSN机器人小新 为您收听下载MSDN中文网络广播课程加油助力!内容介绍• 集合和数据对象 集合 象 • 数据绑定 • 总结Level 200集合和数据对象• • • • 定义集合 定 集合 常用集合类型 创建和操作集合 何时使用泛型集合定义集合• 任何类型的对象都可被组合到 Object Obj t 类型的单个集 合中,以利用采用该语言继承的构造。
例如,C# foreach 语句(Visual Basic 中的 for each)需要集合 中的所有对象都属于单一类型。
• 但是,在 Object 类型的集合中,单独对各元素执行 附加的处理 例如装箱和取消装箱或转换 这影响 附加的处理,例如装箱和取消装箱或转换,这影响 该集合的性能。
装箱和取消装箱通常在存储或检索 Object 类型集合中的值类型时发生。
Object • 泛型集合(如 List<(Of <(T>)>))可避免造成上述性 能损害,前提是元素的类型是集合中所提供的类型 。
此外,强类型集合自动执行添加到该集合的每一 此外 强类型集合自动执行添加到该集合的每 元素的类型验证。
常见的集合类型• 数组集合类型– Array A• 列表集合类型– 泛型 List<(Of <(T>)>) • 字典集合类型– Dictionary<(Of <(TKey, TValue>)>) • 队列集合类型– Queue<(Of <(T>)>) 泛型类是实现• 堆栈集合类型– St Stack<(Of <(T>)>) k<(Of <(T>)>) 泛型类是实现 ICollection IC ll ti 接口的后进先出集合 类• 位集合类型– BitArray Bi A 类是 个集合类 类是一个集合类创建和操作集合• 不同需求选择不同的数据存储方式 • 需要一个序列列表,其中的元素通常在检索其 值后被放弃 • 是否需要以某种顺序访问元素,例如 FIFO、 LIFO 或随机访问 LIFO • 是否需要通过索引访问每一元素 • 每一元素将包含一个值、一个键和一个值的组 每 元素将包含 个值 个键和 个值的组 合还是一个键和多个值的组合 • 是否需要只接受字符串的集合 • LINQ to Objects 何时使用泛型集合• C Collection<(Of <(T>)>) ll ti <(Of <(T>)>) 是可以用作基类的泛型类。
Silverlight实⽤窍门系列:15.Visifire图表控件的使⽤⼆(DataPoi。
图表应⽤于表现数据量,进⾏直观的对⽐,但是在某⼀些领域中如果数据之间⼤⼩差异过⼤,那么会出现某⼀些数据因为过⼩,⽽⽆法让⽤户看见的情况。
例如在统计⼀组⽤户电脑的⽹络发包量的时候,有⼀些⽤户开启电脑⼏⼗个⼩时,有⼀些⽤户开启电脑⼏秒钟。
很明显⽤户开机⼏⼗个⼩时的发包量巨⼤,⽽开机⼏秒钟的发包量极⼩,如果放在⼀个Visifire的图标中组成⼀个统计列的时候,发包量⼩的电脑⼏乎看不见了。
这种情况下,我们就可以通过点击⽂字标注栏的Legend⽂字来确定某⼀个在图表上看不见的⽤户电脑的发包量。
⾸先我们设置⼀个实体类,该类包含(ComputerName,NetWorkNum)两个属性,分别代码电脑名和电脑⽹络发包量:///<summary>///电脑信息///</summary>public class ComputerInfomation{string _ComputerName;string _NetWorkNum;///<summary>///电脑名称///</summary>public string ComputerName{get { return _ComputerName; }set { _ComputerName = value; }}///<summary>///⽹络发送包///</summary>public string NetWorkNum{get { return _NetWorkNum; }set { _NetWorkNum = value; }}}再实例化该类形成多个实体类对象集合,MainPage.xaml.cs的构造函数中敲⼊代码如下:ComputerList = new List<ComputerInfomation>(){new ComputerInfomation(){ComputerName="张三的电脑", NetWorkNum="32143242223"},new ComputerInfomation(){ComputerName="李四的电脑", NetWorkNum="23432423"},new ComputerInfomation(){ComputerName="王五的电脑", NetWorkNum="12342342344"},new ComputerInfomation(){ComputerName="刘六的电脑", NetWorkNum="562342"},new ComputerInfomation(){ComputerName="林七的电脑", NetWorkNum="55353453445"},new ComputerInfomation(){ComputerName="马林的电脑", NetWorkNum="2454555543"}};BindChart(ComputerList);现在⽤户电脑数据已经准备好了,我们开始制作⼀个函数,此函数创建⼀个图表并且设置相应的Legend⽂字标注栏的事件绑定:List<ComputerInfomation> ComputerList = new List<ComputerInfomation>();///<summary>///绑定⼀个图标///</summary>///<param name="computerList">⽤户电脑类实体集合</param>public void BindChart( List<ComputerInfomation> computerList){Chart chart = new Chart();chart.Width = 400;chart.Height = 550; = "Chart";chart.SetValue(Canvas.LeftProperty, 30.0);chart.SetValue(Canvas.TopProperty, 30.0);chart.Theme = "Theme1";//设置⽪肤chart.BorderBrush = new SolidColorBrush(Colors.Gray);chart.AnimatedUpdate = true;chart.CornerRadius = new CornerRadius(7);chart.ShadowEnabled = true;chart.Padding = new Thickness(4, 4, 4, 10);#region设置TitleTitle title = new Title();title.Text = "电脑⽹络发包统计";chart.Titles.Add(title);#endregion#region设置AxesXAxis xAxis = new Axis();xAxis.Title = "⽤户电脑";chart.AxesX.Add(xAxis);#endregion#region设置AxesYAxis yAxis = new Axis();yAxis.Title = "⽤户⽹卡发送包";yAxis.Prefix = "发送:";yAxis.Suffix = "包";chart.AxesY.Add(yAxis);#endregion#region设置PlotAreaPlotArea plot = new PlotArea();plot.ShadowEnabled = false;chart.PlotArea = plot;#endregion#region设置LegendsLegend legend = new Legend();//Legend⽂字标注栏绑定⼀个事件Legend_MouseLeftButtonDownlegend.MouseLeftButtonDown += new EventHandler<LegendMouseButtonEventArgs>(Legend_MouseLeftButtonDown); chart.Legends.Add(legend);#endregion#regionVisifire.Charts.ToolTip tip = new Visifire.Charts.ToolTip();tip.VerticalAlignment = VerticalAlignment.Bottom;chart.ToolTips.Add(tip);#endregion#region创建数据序列和数据点foreach (ComputerInfomation cominfo in computerList){DataSeries dseries = new DataSeries();//设置⼀个数据序列的LengendText值为ComputerNamedseries.LegendText = puterName;//设置图表的类型为RenderAs.StackedColumndseries.RenderAs = RenderAs.StackedColumn;//设置⼀个数据点DataPoint dpointUpload = new DataPoint();//数据点的Y坐标值dpointUpload.YValue =double.Parse(WorkNum);//数据点的Tag值也为电脑名称,⽤于数据点被点击后对⽐判断当前点击的点dpointUpload.Tag = puterName;//设置数据点被点击之后触发事件Dpoint_MouseLeftButtonDowndpointUpload.MouseLeftButtonDown += new MouseButtonEventHandler(Dpoint_MouseLeftButtonDown);dseries.DataPoints.Add(dpointUpload);chart.Series.Add(dseries);}#endregion#region设置遮罩,将Visifire的LOGO遮挡住。
最后还剩下游戏入口部分,Silverlight是客户端插件,因此首选WCF作为它与服务器端数据库的桥接。
撇去UI方面华丽的动态角色创建与选择不再多说,本节的重点便是在教程Demo的基础上整合进基于WCF的注册与登陆等操作,使之最终成为一款相对完整而五脏俱全的RPG作品。
依旧钟情于LINQ,因此LINQ to SQL成为我操作数据库的首选。
强烈建议大家首先参考这篇文章:数据库LINQ TO SQL在Silverlight中的应用(WCF),其中的所有细节都已阐述得相当详细。
如果你的电脑中存有之前的Demo源码,那么接下来你可以按照下面的步骤跟着我一步步从零开始搭建游戏的登陆部分,真真切切的体会WCF技术在Silverlight中的常规应用。
第一步:依照游戏中角色注册、创建、相关信息及登录等需求设计数据库,并编写好相应可能会用到的增删改查等存储过程(本节Demo源码中附带了名为FS3.sql的数据库文件,表和存储过程都在其中)。
第二步:在Silverlight的寄主Web项目中右键->添加新项目->LINQ to SQL映射类,这里我取名为L2S.dbml:第三步:打开VS视图中的服务器资源管理器,右键添加SQL连接到FS3(SQL版本最好2005以上)后将其中的表和存储过程等均拖到L2S.dbml的设计窗口中形成大家再熟悉不过的映射:第四步:此时便可编写WCF操作类了,在Silverlight的寄主Web 项目中右键->添加WCF服务,取名为WCFService.svc:需要特别注意的是带返回类型的存储过程需要修改其相应属性为表实体,否则后面的逻辑查找不到:第五步:编写具体操作逻辑,搞过WCF开发的朋友此处可完全忽略,超级简单;没搞过的也很容易看懂,具体就不多说啦,直接列代码:[ServiceContract(Namespace = "")][AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityR equirementsMode.Allowed)][ServiceBehavior(IncludeExceptionDetailInFaults = true)]public class WCFService {[OperationContract]public void DoWork() { }///<summary>///添加新用户(添加过程中字符型超出限制长度则自动截取)///</summary>///<returns>新用户的ID,0则表示失败</returns>[OperationContract]public long InsertUser(string userName, string password, string real Name, string idCard, string eMail, string address) {using (L2SDataContext dc = new L2SDataContext()) {return Convert.ToInt64(dc.p_InsertUser(userName, password, r ealName, idCard, eMail, address, "", "").ReturnValue);}}///<summary>///用户资料验证///</summary>///<param name="userName">用户名</param>///<returns>0表示不存在</returns>[OperationContract]public int CheckUserExist(string userName) {using (L2SDataContext dc = new L2SDataContext()) {return dc.p_CheckUserExist(userName);}}///<summary>///用户登陆验证///</summary>///<param name="userName">用户名</param>///<param name="password">密码</param>///<returns>0表示不匹配</returns>[OperationContract]public int UserLogonValidate(string userName, string password) { using (L2SDataContext dc = new L2SDataContext()) {return dc.p_CheckUserLogon(userName, password);}}///<summary>///检查角色是否已存在///</summary>///<param name="name">角色名</param>///<returns>0表示不存在</returns>[OperationContract]public int CheckRoleExist(string name) {using (L2SDataContext dc = new L2SDataContext()) {return dc.p_CheckRoleExist(name);}}///<summary>///检查用户创建的角色数量///</summary>///<param name="userName">用户名</param>///<returns>角色数</returns>[OperationContract]public int GetUserRoleNum(string userName) {using (L2SDataContext dc = new L2SDataContext()) {return dc.p_GetUserRoleNum(userName);}}///<summary>///添加新角色///</summary>///<returns>新角色的ID,0则表示失败</returns>[OperationContract]public long InsertRole(string userName, string name, byte avatar, by te sex, byte occupation, byte roleLevel, long experience, long mapID, strin g lastIP, string remarks) {using (L2SDataContext dc = new L2SDataContext()) {return Convert.ToInt64(dc.p_InsertRole(userName, name, avata r, sex, occupation, roleLevel, experience, mapID, lastIP, "").ReturnValue); }}///<summary>///根据用户名获取该用户的所有角色///</summary>///<param name="userName">用户名</param>///<returns>创建的所有角色</returns>[OperationContract]public List<Role> GetRoleByUserName(string userName) {using (L2SDataContext dc = new L2SDataContext()) {return dc.p_GetRoleByUserName(userName).ToList<Role>();}}///<summary>///删除角色记录///</summary>///<param name="roleName">角色名</param>///<returns>失败0,成功1</returns>[OperationContract]public int DeleteRole(string roleName) {using (L2SDataContext dc = new L2SDataContext()) {return dc.p_DeleteRole(roleName);}}}复制代码第六步:也是最后一步,在RPGEffectsDemo项目中右键添加服务引用(Service References),然后检索到WCFService.svc完成即可。
Silverlight 数据验证本文引用自/jv9/archive/2010/09/10/1822910.html页面有实例的源代码下载:说起来Validation验证功能,相信大家都不陌生,在应用中,当需要用户交互输入时,开发人员都会加入一些验证代码,这样可以有效的避免应用异常出现,也可以使应用的错误提示信息清晰明了的显示在客户端,有利于异常定位,同时也提高用户体验。
特别是在商业应用项目中,使用Validation功能,可以在数据存入存储设备前,进行格式,以及内容的校验,这样也提高了数据存储的安全性。
下面的的验证控件演示,是传统Web应用中最常见的验证效果,其中包括Requ ired Field Validator,Range Validator等验证控件,Ajax Validation:而Silverlight同样提供类似于验证控件的支持,在Silverlight Toolkit开源项目中,包含Data Input的Validation演示,简单数据绑定验证,下图为ValidationSummary控件演示:为了帮助大家学习和掌握Silverlight的Validation功能,随后的几篇,我将详细介绍一下S ilverlight的Validation功能,并将结合一些实例演示帮助大家理解Validation验证功能。
本系列应用开发环境是:Windows 7 Ultimate 英文版Visual Studio 2010 Premium 英文版Expression Blend 4 Premium 英文版Silverlight 4Validation验证概述Validation,是验证,校验的意思,通常发生在用户输入数据后,进行验证判断,以确认用户输入正确信息。
在验证的方法中,我们可以简单的从两个验证类型理解Validation,1. 语法验证,该验证类型是通过成员的数据类型定义对比验证当前输入数据类型得出的验证结果;例如,定义一个int类型,而赋值是string时,则会返回错误异常,验证控件,将获取该异常信息反馈到客户端;1publicint Zip {get;set}语法验证经常发生在数据改变之前,其表现方式会在UI中体现;2. 语义验证,该验证类型是将当前输入数据根据特定数据限制代码进行验证;例如:指定某TextBox为必须输入,或者限定某TextBox内容长度,或者使用正则表达式控制其输入内容,最典型的例子是对电子邮件地址的验证:语义验证通常会发生在数据改变之后,其表现方式可以由开发人员控制,不一定会在UI中体现;一个简单的数据绑定,异常捕获验证时序图,本篇,不计划讲解该图,我将在随后的实例中,解释该验证原理。
现在,我们将创建一个新的实例项目,SilverlightValidationDemo在MainPage,创建简单的用户交互界面:另外需要准备一个简单的数据成员类,方便随后的演示,在实例演示前,我们仍旧需要先学习一下Silverlight的Validation数据验证框架基础属性和事件,首先需要了解的是BindingValidationError事件该事件是一个路由事件,当数据验证错误出现时,将绑定该错误到数据源;也可以简单的理解为绑定错误到数据源的一个行为。
该事件可在控件本身调用,也可在其父控件中调用。
例如,在TextBox中,可以声明调用BindingValidationError,或者可以该TextBox的父容器控件Grid,StackPanel中调用BindingValidationError事件。
这里需要注意的是,如果在Silverlight的MVVM设计模式下,仅在被验证的控件本身激活BindingValidationError 事件,才能正常的被UI捕获到错误信息,不支持在父控件中对BindingValidationError事件进行调用。
为了保证Validation的灵活性,微软同时提供了相关属性,来控制BindingValidationErro r事件的调用。
NotifyOnValidationError和ValidatesOnExceptions属性。
NotifyOnValidationError属性该属性的功能,是当验证错误出现时是否激活BindingValidationError事件;该属性是Sil verlight独有的验证属性之一,经常和ValidatesOnExceptions属性配合使用。
ValidatesOnExceptions属性该属性的功能,数据绑定引擎是否捕获显示异常错误作为验证错误。
简单的理解,在控件绑定数据时,出现数据源异常抛出,或者数据类型转换时异常抛出,是否作为Validation验证显示在客户端。
如果是True,则会按照Validation传统的处理方式,弹出一个红色说明标签,内容是异常错误信息,反之,则不捕获异常作为Validation。
对于Silverlight开发新手而言,初次看到以上概念,会有混淆,请继续看下面实例,结合实例来理解以上的属性和事件使用方法。
首先,我们在MainPage中,将我们起初定义的User类添加作为一个静态数据源,1xmlns:local="clr-namespace:SilverlightValidationDemo"1<UserControl.Resources>2<local:User x:Key="UserDataContext"/>3</UserControl.Resources>对于控件数据绑定,在Visual Studio中可以通过视图设定,也可以直接敲入代码设定,这里,我们使用视图的方法,减少代码输入量,在MainPage中,选中txtUserName文本框,右键选择属性,在属性框中,设置绑定数据源,选择Common - DataContext,然后选择“Apply Data Binding.." 选择数据源这里,数据源可以选择外部数据源,也可以选择Element绑定源,我们则使用StaticResou rce静态数据源,也就是我们刚才创建的UserDataContext,选中后,绑定数据源已经完成,则需要设置控件绑定字段设置,选择Common - Text属性,然后选择Apply Data Binding...,进入后可以看到,数据源,已经绑定为“DataContext - User”,而数据源中的成员名称已经被自动列出,我们需要指定绑定成员名称,然后,选择“Options”,在选项中,选中“NotifyOnValidationError”和“ValidatesOnExcepti ons”,这样控件绑定设置已经完成了,这时,可以切换到Xaml代码界面查看一下当前txtUserNa me的代码可以发现,Visual Studio 2010已经自动生成了绑定代码,如下:1<TextBox x:Name="txtUserName" Width="200"DataContext="{Binding Source={Static ResourceUserDataContext}}" Text="{Binding Path=Name, Mode=TwoWay, ValidatesOn Exceptions=True, NotifyOnValidationError=True}"/>现在,我们在name数据成员属性中,添加简单的判断代码:1privatestring _name;2publicstring Name3{4get { return _name; }5set6{7if (string.IsNullOrEmpty(value))8{9thrownew Exception("用户名不能为空.");10}11_name = value;12}13}这样一个简单的Validation数据验证功能就完成了。
大家可以试着将ValidatesOnExceptions=True代码设为False,看看是否还能捕获异常验证?下面,看看BindingValidationError事件和NotifyOnValidationError属性的应用,我们添加一个TextBlock控件,用来显示验证异常信息,1<StackPanel Orientation="Horizontal">2<TextBlock x:Name="tbMessage" Margin="5" Foreground="Red"/>3</StackPanel>在MainPage中的LayoutRoot布局控件中,添加BindingValidationError事件,1<Grid x:Name="LayoutRoot" Background="White"BindingValidationError="LayoutRo ot_BindingValidationError">后台定义:1privatevoid LayoutRoot_BindingValidationError(object sender, ValidationErrorE ventArgs e)2{3if (e.Action == ValidationErrorEventAction.Added)4{5(e.OriginalSource as Control).Background = new SolidColorBrush(Colors.Yellow); 6tbMessage.Text= e.Error.Exception.Message;7}89if (e.Action == ValidationErrorEventAction.Removed)10{11(e.OriginalSource as Control).Background = new SolidColorBrush(Colors.White); 12tbMessage.Text = "";13}14}在验证异常出现时,由于NotifyOnValidationError属性设置为True,所以,会执行Bindi ngValidationError事件,其中tbMessage会显示验证错误信息,而验证控件样式也会有改变。