Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary

本文主要是介绍Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇,我们讨论了,捕获用户提交数据验证。本篇将集中讨论Datagrid和Dataform两个数据控件的数据验证方法,其中,我们会附加介绍一个新的验证控件ValidationSummary。

 

概述

Datagrid和Dataform是Silverlight中最常用的两个数据控件,其主要目的是作为数据集合的载体控件。这两个控件不仅支持自动数据绑定,而且允许用户添加许多自定义行为操作,例如编辑,排序,删除,添加等。而在日常项目开发中,经常会碰到用户在编辑,或者添加时对数据的验证判断,在数据commit前,即捕获数据异常并返回提示信息到客户端。

 

ValidationSummary控件

在Datagrid和Dataform数据验证中,最为常用的是ValidationSummary控件,该控件和WebForm中的ValidationSummary控件类似,其功能都是将错误信息集合显示在一个ListBox控件中。简单的说,ValidationSummary控件是一个能够容纳验证错误集合的容器,能够检测和显示当前页面所有验证结果到客户端。

 

命名控件:System.Windows.Controls

装配:System.Windows.Controls.Data.Input (位于 System.Windows.Controls,Data.Input.dll)

 

我们仍旧使用上一篇的源代码项目,SilverlightValidationDemo,简单修改代码如下:

首先需要添加新的命名空间引用,

 

 

然后添加ValidationSummary控件,即可

 

 

 

其运行结果如下:

 

 

这样就一个ValidationSummary使用实例。细心的朋友可能已经发现,上图,一共出现了八处验证错误提示,而在ValidationSummary中,仅显示了四个。这里需要对此进行简单的说明

 

1. 如果使用ValidationSummary控件捕获验证错误,必须将Mode设置为Twoway;

2. 如果使用ValidationSummary控件捕获验证错误,必须将ValidatesOnExceptions设置为True;

3. 如果使用ValidationSummary控件捕获验证错误,必须将NotifyOnValidationError设置为True;

 

在我们原有的代码中,都没有满足以上条件,所以ValidationSummary忽略其验证错误信息。参考代码如下:

 

< StackPanel  Orientation ="Horizontal"  Margin ="5" >
                
< TextBlock  Text ="邮   件: "  VerticalAlignment ="Center" />
                
< TextBox  x:Name ="txtEmail"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  Text =" {Binding Path=email, Mode=TwoWay, ValidatesOnNotifyDataErrors=False, NotifyOnValidationError=True, ValidatesOnExceptions=True} "   />
            
</ StackPanel >
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >
                
< TextBlock  Text ="地   址: "  VerticalAlignment ="Center" />
                
< TextBox  x:Name ="txtAddress"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  Text =" {Binding Path=address, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=False, ValidatesOnExceptions=True} "   />
            
</ StackPanel >
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >
                
< TextBlock  Text ="电   话: "  VerticalAlignment ="Center" />
                
< TextBox  x:Name ="txtPhone"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  Text =" {Binding Path=phone, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=False, ValidatesOnExceptions=True} "   />
            
</ StackPanel >
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >
                
< TextBlock  Text ="成绩等级: "  VerticalAlignment ="Center" />
                
< TextBox  x:Name ="txtGradeLevel"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  Text =" {Binding Path=gradelevel, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=False, ValidatesOnExceptions=True} "   />
            
</ StackPanel >
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >
                
< TextBlock  Text ="成绩范围: "  VerticalAlignment ="Center" />
                
< TextBox  x:Name ="txtGradeRange"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  Text =" {Binding Path=graderange, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=False, ValidatesOnExceptions=True} "   />
            
</ StackPanel >

 

 

 

ValidationSummary控件,提供了许多属性,允许开发人员自定义其调用,例如,如果不想让ValidationSummary控件捕获显示UserName用户名验证错误,只需在代码中添加,dataInput:ValidationSummary.ShowErrorsInSummary = “False”,就可以了。

 

< StackPanel  Orientation ="Horizontal"  Margin ="5"  x:Name ="spUsername" >  
                
< TextBlock  Text ="用户名: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtUserName"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  Text =" {Binding Path=Name, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True,UpdateSourceTrigger=Explicit} "  dataInput:ValidationSummary.ShowErrorsInSummary  = "False" />  
</ StackPanel >

 

 

在明白了ValidationSummary控件的使用后,我们来看看Datagrid数据验证的使用。

 

Datagrid数据验证

 

Datagrid控件的主要功能是将数据集合使用表格的方式展示到客户端。该控件支持大量的属性和事件,允许用户对数据集合进行操作,例如修改数据,添加数据,删除等操作。在这些操作中,数据验证也是最常用的功能之一。为了演示该实例,我们将添加一个简单的数据集合和一个Datagrid控件,并将该数据集合绑定到Datagrid控件,

 

在User数据成员类中,定义一个新的构造函数:

 

public  User( string  strname, string  strpwd, int  iage, string  stremail) 

    Name 
=  strname; 
    password 
=  strpwd; 
    Age 
=  iage; 
    email 
=  stremail; 
}

 

 

在MainPage中,添加新的命名空间引用:

 

xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"

 

 

然后,添加一个datagrid控件,

 

< data:DataGrid  x:Name ="dgValidationDemo"  
                           AutoGenerateColumns
="False"  
                           Margin
="10"  Width ="350"  
                           HorizontalAlignment
="Left"  
                           
>  
                
< data:DataGrid.Columns >  
                    
< data:DataGridTextColumn  Header ="用户名"  Binding =" {Binding Name,Mode=TwoWay} " />  
                    
< data:DataGridTextColumn  Header ="密码"  Binding =" {Binding password,Mode=TwoWay} "   />  
                    
< data:DataGridTextColumn  Header ="年龄"  Binding =" {Binding Age,Mode=TwoWay} " />  
                    
< data:DataGridTextColumn  Header ="电子邮件"  Binding =" {Binding email,Mode=TwoWay} "   />  
                
</ data:DataGrid.Columns >  
</ data:DataGrid >

 

 

在MainPage后台代码中,添加数据集合初始化代码:

 

         private  List < User >  InitCollection() 
        { 
            List
< User >  tmpUserCollection  =   new  List < User > (); 
            tmpUserCollection.Add(
new  User( " jv9 " " 123456 " 99 " qq34506@hotmail.com " )); 
            tmpUserCollection.Add(
new  User( " 冷秋寒 " " 654321 " 88 " admin@hotmail.com " )); 
            tmpUserCollection.Add(
new  User( " Silverlight " " 666666 " 77 " silverlight@hotmail.com " )); 
            tmpUserCollection.Add(
new  User( " 银光中国 " " 888888 " 66 " admin@silverlightchina.net " )); 
            
return  tmpUserCollection; 
        }

 

 

然后在MainPage页面构造函数中,进行数据绑定:

 

dgValidationDemo.ItemsSource  =  InitCollection();

 

 

运行即可看到如下图:

 

 

Silverlight Datagrid的数据验证大体可分为两种:单元格数据验证和数据行验证;下面我们使用实例演示讲解着两种验证方法,

 

1. 单元格数据验证

单元格数据验证,顾名思义,是对Datagrid中的某一个单元格进行Validation。

 

 

 

这种验证可以基于前几篇中的四种验证机制对数据进行判断,最为常用的验证机制方式为:基本异常验证和DataAnnotation验证机制。

 

2. 行数据验证

行数据验证,其功能性和单元格数据验证相同,而其验证作用范围是被验证数据整行。当行数据验证出现错误时,则会在Datagrid底部显示一个ListBox显示其错误信息,其样式和ValidationSummary相似,点击ListBox错误信息,即可跳入验证出错行。

 

这时会发现,出现验证错误整行背景成为粉红色,而出错的单元格,不再显示红框验证错误提示,其错误信息被显示在Datagrid底部。

 

 

 

行数据验证和单元格数据验证最大的不同,是其锁定的范围不同。当使用行数据验证时,尽管当前单元格验证有错误,用户仍旧可以继续修改该行中其他数据单元格,其焦点被锁定在整行;而单元个验证,则被锁定在某一个单元格,数据验证报错,用户无法切换焦点,必须纠正验证错误后,才能继续下一步操作。

 

 

 

DataForm数据验证

 

DataForm数据控件是Silverlight 3 Toolkit中推出的数据处理表格控件。该控件可将数据集合成员显示到客户端。其中自带添加,修改,删除等内建功能。

由于使用该控件需要对数据集合成员进行绑定,每次绑定就已经将Validation验证框架应用Dataform中,每当验证错误出现时,DataForm控件将自动捕获验证错误,并显示在客户端。

使用该控件需要添加以下命名空间引用:

 

xmlns:dataform="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit"

 

 

我们在MainPage中,添加DataForm控件代码

 

< dataform:DataForm  x:Name ="dfDetail"  
                               Margin
="10"  Width ="350"  Height ="300"  
                               HorizontalAlignment
="Left"  
                               AutoGenerateFields
="False"  
                               ItemsSource
=" {Binding} " >  

                
< dataform:DataForm.EditTemplate >  
                    
< DataTemplate >  
                        
< StackPanel >  
                            
< dataform:DataField >  
                                
< StackPanel  Orientation ="Horizontal" >  
                                    
< TextBlock  Text ="用户名: "  VerticalAlignment ="Center" />  
                                    
< TextBox  Text =" {Binding Name, Mode=TwoWay, ValidatesOnDataErrors=True} "  VerticalAlignment ="Center"  Width ="100" />  
                                
</ StackPanel >  
                            
</ dataform:DataField >  
                            
< dataform:DataField >  
                                
< StackPanel  Orientation ="Horizontal" >  
                                    
< TextBlock  Text ="密码: "  VerticalAlignment ="Center" />  
                                    
< TextBox  Text =" {Binding password, Mode=TwoWay, ValidatesOnDataErrors=True} "  VerticalAlignment ="Center"  Width ="100" />  
                                
</ StackPanel >  
                            
</ dataform:DataField >  
                            
< dataform:DataField >  
                                
< StackPanel  Orientation ="Horizontal" >  
                                    
< TextBlock  Text ="年龄: "  VerticalAlignment ="Center" />  
                                    
< TextBox  Text =" {Binding Age, Mode=TwoWay, ValidatesOnDataErrors=True} "  VerticalAlignment ="Center"  Width ="100" />  
                                
</ StackPanel >  
                            
</ dataform:DataField >  
                            
< dataform:DataField >  
                                
< StackPanel  Orientation ="Horizontal" >  
                                    
< TextBlock  Text ="电子邮件: "  VerticalAlignment ="Center" />  
                                    
< TextBox  Text =" {Binding email, Mode=TwoWay, ValidatesOnDataErrors=True} "  VerticalAlignment ="Center"  Width ="100" />  
                                
</ StackPanel >  
                            
</ dataform:DataField >  
                        
</ StackPanel >  
                    
</ DataTemplate >  
                
</ dataform:DataForm.EditTemplate >  
</ dataform:DataForm >

 

 

在DataForm中,我们对已知数据成员进行绑定设置。下面需要简单修改Mainpage后台代码,将数据集合绑定到DataForm:

 

         public  MainPage() 
        { 
            InitializeComponent(); 
            
// dgValidationDemo.ItemsSource = InitCollection(); 

            PagedCollectionView pcv 
=   new  PagedCollectionView(InitCollection()); 
            spDataCollection.DataContext 
=  pcv; 

        }

 

 

这里我们使用了PagedCollectionView 类,将原有的List<User>转换为PagedCollectionView ,将其绑定到spDataCollection布局控件的DataContext,从而实现该布局下所有数据控件ItemsSource共同绑定同一个数据源。当Datagrid选择项被修改时,DataForm当前项也同时修改。

 

 

这时,我们可以对DataForm进行简单的验证测试:

当我们点击添加一行新数据时,保持所有TextBox为空,点击Submit,则会看到Dataform返回的验证错误信息提示:

 

 

 

这时,数据集合已经被锁定,无论是Datagrid还是Dataform都无法做任何数据操作。

 

 

 

 

 

以上可以看出,对于Dataform的数据验证,开发人员无需进行过多的干涉,Validation验证框架会自动接管其验证进程。

 

Ok,今天的内容就讲到这里,希望大家能有所收获。

 

 

源代码第一部分下载

源代码第二部分下载

这篇关于Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291210

相关文章

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动