上一篇,我们讨论了,捕获用户提交数据验证。本篇将集中讨论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,今天的内容就讲到这里,希望大家能有所收获。

源代码第一部分下载

源代码第二部分下载

转载于:https://www.cnblogs.com/kingdom_0/articles/2293267.html

Silverlight – Datagrid,Dataform数据验证和ValidationSummary相关推荐

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

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

  2. Silverlight实例教程 - Validation数据验证开篇

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  3. Silverlight实例教程 - Validation验证系列汇总

    转自http://www.cnblogs.com/jv9/archive/2010/09/27/1836394.html Silverlight Validation验证系列教程,详细讲解Silver ...

  4. Silverlight实例教程 - Validation数据验证基础属性和事件

    上篇介绍了Silverlight的Validation数据验证的好处和概述,其中了解到Silverlight数据验证方法可以被抽象为语法验证和语义验证,其中前者是通过数据类型定义对比验证,而后者是通过 ...

  5. SilverLight4.0数据验证IDataErrorInfo, INotifyDataErrorInfo[转]

    原文地址:http://www.cnblogs.com/webabcd/archive/2010/09/09/1821911.html 介绍 Silverlight 4.0 数据验证: IDataEr ...

  6. Silverlight Telerik控件学习:数据录入、数据验证

    相信很多人都听说过这句名言:garbage in ,garbage out ! 数据录入不规范(或错误)就象一颗定时炸弹,迟早会给系统带来麻烦,所以在数据录入时做好验证是很有必要的. 相对传统asp. ...

  7. 稳扎稳打Silverlight(17) - 2.0数据之详解DataGrid, 绑定数据到ListBox

    [索引页] [源码下载] 稳扎稳打Silverlight(17) - 2.0数据之详解DataGrid, 详解ListBox 作者:webabcd 介绍 Silverlight 2.0 详解DataG ...

  8. Silverlight - Validation 客户端同步数据验证

    前文介绍过Silverlight Validation中两个数据验证机制,ValidatesOnExceptions异常捕获验证机制和DataAnnotation验证机制,这两种验证机制,是在Silv ...

  9. Silverlight实例教程 - Validation用户提交数据验证捕获

    在以往的Validation系列中,介绍了四种Silverlight验证机制: 基本异常验证机制: DataAnnotation验证机制: IDataErrorInfo客户端同步验证机制: INoti ...

最新文章

  1. 【REACT NATIVE 系列教程之四】刷新组件RENDER(重新渲染)的三种方式详解
  2. 7 = 350 000 000 ?!
  3. Windows 10如何禁用Microsoft Edge标签页预览
  4. H3C 多区域MSTP配置
  5. 一道微软公司的面试题目的算法实现
  6. 学生签到系统c代码_C语言实现简单学生学籍管理系统
  7. php连接mssql数据库的几种方式
  8. Ubuntu出现没有正确安装GNOME电源管理器的默认配置
  9. python绘制动态图表怎么存下来_做动态图表,没有数据?用Python就能获取!
  10. archlinux详细安装步骤_最新Centos的liunx安装宝塔的详细步骤
  11. 最近一段时间网上有一些报道称35岁以后只有两种人可以幸福的老去
  12. 在微服务中,Kubernetes软件组件有哪些?
  13. C# 取Visio模型信息的简易方法
  14. # 图书馆网上销售系统(c#+sql server)
  15. android版usb转网线驱动,usb网线转换器驱动下载
  16. 线性回归中一次性实现所有自变量的单因素分析
  17. linux系统图形界面
  18. 山东最新高级消防设施操作员考试真题及答案
  19. 计算机硬盘没内存怎么办,怎么处理闲置旧电脑,内存硬盘都是宝,卖了才可惜!...
  20. 三分法 three-way partitioning

热门文章

  1. 被神话的大数据——从大数据(big data)到深度数据(deep data)思维转变
  2. 微信小程序开发框架从入门到放弃
  3. Forrester:全球供应商在中国处于领导地位 但本土供应商却在私有云市场蒸蒸日上...
  4. PHP整理笔记八正则表达式
  5. 《术以载道——软件过程改进实践指南》—第1章1.1节对CMMI的基本认识
  6. CrackMe-CrackHead
  7. Educational Codeforces Round 12 C. Simple Strings 贪心
  8. 自定义View实现图片的绘制、旋转、缩放
  9. 方法功能从无参方法、含参方法到重载方法
  10. Rsync服务让SLB下多台centos服务器文件同步更新