为编辑与插入界面添加验证控件

本文档是 Visual C# 教程 (切换到 Visual Basic 教程)

在本教程中,我们将了解如何轻松为数据 Web 控件的 EditItemTemplate 和 InsertItemTemplate 添加验证控件,以提供更加简单的用户界面。

« 前一篇教程  |  下一篇教程 »

简介

在前三篇教程所探讨的示例中,GridView 与 DetailsView 控件全都是由 BoundField 与 CheckBoxField 组成的(当通过智能标记将 GridView 或 DetailsView 绑定到数据源控件时,Visual Studio 会自动添加这些字段类型)。当在 GridView 或 DetailsView 中编辑行时,那些非只读的 BoundField 会被转换为文本框,终端用户可在文本框中修改已有数据。同样,当向DetailsView 控件中插入一条新记录时,那些赋值为 True (默认)的 InsertVisible 属性的 BoundField 会呈现为空文本框,用户可在空文本框中提供新记录的字段值。类似地,对于在标准和只读界面中禁用的 CheckBoxField ,在编辑与插入界面中被转换为已启用的复选框。

虽然默认的编辑与插入界面的 BoundField 与 CheckBoxField 有一定作用,但是这些界面没有任何验证功能。如果用户错误地输入了数据,如遗漏了ProductName 字段或者输入了无效的 UnitsInStock 值(如-50),将会导致应用程序架构内部发生异常。虽然如前一篇教程所示,可以正常处理这种异常,但最好使编辑或插入用户界面包含验证控件,以便在第一时间就避免了用户输入这种无效数据。

为了能提供自定义的编辑或插入界面,我们需要将BoundField 或 CheckBoxField 替换为TemplateField 。TemplateField 是在 GridView控件中使用 TemplateField 与在 DetailsView 控件中使用 TemplateField 教程中讨论的主题,它包括多个模板,这些模板为不同的行状态定义了独立的界面。当呈现DetailsView 或 GridView 控件中的只读字段或行时,会用到TemplateField 的 ItemTemplate ,而 EditItemTemplate 与InsertItemTemplate 则分别表示了用作编辑与插入模式的界面。

在本教程中,我们将了解如何轻松为 TemplateField 的 EditItemTemplate 和 InsertItemTemplate 添加验证控件,以提供更加简单的用户界面。具体而言 ,本教程会使用 探讨与插入、更新、删除相关的事件教程中创建的示例,并将编辑与插入界面扩充,使其包括适当的验证功能。

步骤1 :复制 “探讨与插入、更新、删除相关的事件” 中的示例

探讨与插入、更新、删除相关的事件教程中,我们创建了一个页面,它在可编辑的 GridView 中列出了产品的名称和价格。此外,这个页面包含了一个 DetailsView ,它的DefaultMode 属性被赋值为 Insert , 因此它总是呈现为插入模式。从这个DetailsView 中,用户可以输入新产品的名称和价格 ,单击 Insert ,将它添加到系统(见图1) 。

图1:之前的示例允许用户添加新产品,或编辑已有产品

我们在本教程中的目标是扩充 DetailsView 与 GridView ,使其提供验证控件。尤其是,验证逻辑将:

  • 要求插入或编辑产品时必须提供产品名称
  • 要求插入记录时必须提供价格;当编辑记录时,我们也要求必须提供价格,但我们将使用 GridView 的 RowUpdating event handler 中的程序逻辑来实现这个功能,这在前面的教程中已经完成了
  • 确保输入的价格值是有效的货币格式

在我们研究怎样扩充之前的示例以包含验证之前,我们首先要将DataModificationEvents.aspx 页面中的示例复制到本教程的页面,UIValidation.aspx 中来。为此,我们需要复制DataModificationEvents.aspx 页面的声明式标记及其源代码。执行以下步骤获得声明式标记的第一个拷贝:

  1. 在 Visual Studio 中打开 DataModificationEvents.aspx 页面
  2. 转到页面的声明式标记(单击页面下方的 Source 按钮)
  3. 复制 <asp:Content> 和 </asp:Content> 标记 (第 3 行至第 44 行)内的文本,如图 2 所示。

图2:复制 控件内的文本

  1. 打开 UIValidation.aspx 页面
  2. 转到页面的声明式标记
  3. 在 <asp:Content> 控件内粘贴文本。

要复制源代码,打开DataModificationEvents.aspx.vb 页面,仅复制 EditInsertDelete_DataModificationEvents 类之内的文本。复制三个 event handler (Page_Load 、GridView1_RowUpdating 、ObjectDataSource1_Inserting) ,但是不要复制类声明。将复制的文本粘贴到 UIValidation.aspx.vb 中的 EditInsertDelete_UIValidation 类之内

将DataModificationEvents.aspx 中的内容及代码移到UIValidation.aspx 之后,花点时间在浏览器中测试一下您的进度。在这两个页面中,您应该看到相同的输出,体验到相同的功能(回头参考图1 ,可以得到运行中 DataModificationEvents.aspx 的屏幕截图)。

步骤2 :将BoundField转换为TemplateField

要向编辑与插入界面添加验证控件,需要将 DetailsView 与 GridView 控件使用的 BoundField 转换为 TemplateField 。为此,分别单击 GridView 与 DetailsView 的智能标记中的 Edit Columns 与 Edit Fields 链接。在那里选择各 BoundField ,并单击“ Convert this field into a TemplateField ”链接。

图3:将DetailsView与GridView的每个BoundField都转换为TemplateField

在Fields 对话框中将BoundField 转换为TemplateField 时,会生成一个 TemplateField ,它与BoundField 一样提供只读、编辑和插入界面。下面的标记显示的是当DetailsView 中的 ProductName 字段被转换为TemplateField 之后的声明式语法 :

<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
    </EditItemTemplate>
    <InsertItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
    </InsertItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

注意,这个TemplateField 自动创建了三个模板:ItemTemplate 、EditItemTemplate 与 InsertItemTemplate 。ItemTemplate 使用 Label Web 控件来显示单个数据字段值 (ProductName ),EditItemTemplate 与 InsertItemTemplate 在 TextBox Web 控件中显示数据字段值,这个控件使用双向数据绑定,将数据字段与TextBox 的 Text 属性相关联。因为在此页面中我们仅使用DetailsView 进行插入,您可以从两个TemplateField 中删除 ItemTemplate 与 EditItemTemplate , 不过把它们留在那里也没关系。

因为GridView 不支持 DetailsView 内置的插入功能,所以将GridView 的 ProductName 字段转换为TemplateField 时,将只产生 ItemTemplate 与 EditItemTemplate :

<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("ProductName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

单击 “Convert this field into a TemplateField ” 之后,Visual Studio 就创建了一个 TemplateField ,它的模板模拟了已转换 BoundField 的用户界面。您可以使用浏览器访问这个页面,以验证这点。这时会发现,TemplateField 的外观与行为都与使用 BoundField 时的体验一样。

注意:您可以按需要随意自定义模板中的编辑界面。例如,我们可能想让UnitPrice TemplateField 中的 TextBox 呈现得比 ProductName 文本框小一些。为此,可以为TextBox 的 Columns 属性进行合适的赋值,或者通过 Width 属性提供一个绝对宽度。在下一篇教程中,我们将了解怎样通过把 TextBox 替换为另一数据输入 Web 控件的方法来完全自定义编辑界面。

步骤3 :向 GridView 的 EditItemTemplate 添加验证控件

当构建数据输入表单时,用户要输入所有必需的字段,所提供的所有输入都必须是合法的、格式正确的值,这点很重要。为了帮助确保用户的输入有效,ASP.NET 提供了五个内置的验证控件,它们旨在用来对单个输入控件的值进行验证:

查看ASP.NET 快速入门教程 中的验证控件一节 ,可了解有关这五个控件的更多信息。

对于我们的教程来说,我们需要在DetailsView 与 GridView 的ProductName TemplateField 中都使用 RequiredFieldValidator ,还要在DetailsView 的 UnitPrice TemplateField 中使用RequiredFieldValidator 。此外,我们需要为两个控件的UnitPrice TemplateField 添加 CompareValidator ,以确保输入的价格大于或等于0 ,并且是有效的货币格式。

注意:虽然 ASP.NET 1.x 同样只有这五个验证控件,但是 ASP.NET 2.0 又加入了很多改进,其中最主要的两个是除Internet Explorer 之外的浏览器客户端脚本支持,以及将页面上的验证控件分为组的能力。有关2.0 版中新增验证控件特性的更多信息,请参考剖析 ASP.NET 2.0 的验证控件

我们从给GridView 的 TemplateField 中的EditItemTemplate 添加一个RequiredFieldValidator 验证控件开始。为此,需要单击GridView 的智能标记中的 Edit Templates 链接,显示出模板编辑界面。在这里,可以从下拉列表中选择需要编辑的模板。因为我们要扩充编辑界面,所以我们需要为 ProductName 与 UnitPrice 的 EditItemTemplate 添加验证控件。

图4 :我们需要扩充 ProductName 与 UnitPrice 的 EditItemTemplate

在ProductName EditItemTemplate 中,添加一个 RequiredFieldValidator ,方法是将它从 Toolbox 拖动到模板编辑界面内,放在TextBox 之后。

图5 :为 ProductName EditItemTemplate 添加一个RequiredFieldValidator

所有验证控件的作用是验证单个 ASP.NET Web 控件的输入。因此,我们需要指明,刚才添加的RequiredFieldValidator 应该对 EditItemTemplate 中的 TextBox 进行验证;通过将验证控件的ControlToValidate 属性 赋值为适当 Web 控件的 ID 就可以做到这点。目前,TextBox 的 ID 是 TextBox1 ,没什么特点,让我们来将它改得更合适一些。单击模板中的TextBox ,然后从 Properties 窗口将 ID 由 TextBox1 改为EditProductName 。

图6 :将 TextBox 的 ID 改为 EditProductName

接下来,将RequiredFieldValidator 的 ControlToValidate 属性赋值为 EditProductName 。最后,将 ErrorMessage 属性 赋值为 “You must provide the product's name ”,并将 Text 属性 赋值为 “* ” 。如果给出 Text 属性值,验证失败时将由验证控件显示该文本。ErrorMessage 属性值是必需的,由 ValidationSummary 控件使用;如果没有输入Text 属性值,那么在无效输入时 ,ErrorMessage 属性值也会成为验证控件的显示文本。

设置RequiredFieldValidator 的这三个属性后,屏幕显示类似图 7 。

图7 :为 RequiredFieldValidator 的 ControlToValidate 、ErrorMessage 以及 Text 属性赋值

为ProductName EditItemTemplate 添加完 RequiredFieldValidator 之后,剩下的工作就是为 UnitPrice EditItemTemplate 添加必要的验证。对于本页面来说,因为我们已经决定编辑记录时 UnitPrice 为可选,所以我们不需要添加 RequiredFieldValidator 。不过,我们确实需要添加一个CompareValidator ,确保将 UnitPrice(如果有)的格式正确设置为货币并且值大于或等于0 。

在我们为UnitPrice EditItemTemplate 添加 CompareValidator 之前,我们先将TextBox Web 控件的 ID 从 TextBox2 改为 EditUnitPrice 。做完这个更改之后,添加 CompareValidator ,将其ControlToValidate 属性赋值为 EditUnitPrice ,其ErrorMessage 属性赋值为 “The price must be greater than or equal to zero and cannot include the currency symbol ”,以及其 Text 属性赋值为 “* ” 。

要指明 UnitPrice 值必须大于或等于 0 ,需要将CompareValidator 的Operator 属性 赋值为 GreaterThanEqual ,其ValueToCompare 属性 赋值为“0 ”,且其 Type 属性 赋值为 Currency 。下面的声明式语法显示了完成这些更改后的 UnitPrice TemplateField 的EditItemTemplate :

<EditItemTemplate>
    <asp:TextBox ID="EditUnitPrice" runat="server"
      Text='<%# Bind("UnitPrice", "{0:c}") %>'
      Columns="6"></asp:TextBox>
    <asp:CompareValidator ID="CompareValidator1" runat="server"
        ControlToValidate="EditUnitPrice"
        ErrorMessage="The price must be greater than or equal to zero and
                       cannot include the currency symbol"
        Operator="GreaterThanEqual" Type="Currency"
        ValueToCompare="0">*</asp:CompareValidator>
</EditItemTemplate>

做完这些更改后,在浏览器中打开页面。如果编辑产品时试图忽略名称或者输入无效的价格,文本框旁边将显示一个星号。如图 8 所示,包含货币符号的价格值,如 $19.95 ,被认为是无效值。CompareValidator 的 Currency Type 允许有数字分隔符(例如逗号或句号 ,其用法 取决于不同的区域设置)以及前面的加号或减号,但是允许有货币符号。当正在编辑的界面呈现货币格式的UnitPrice 时,这种行为可能使用户疑惑。

注意:回想一下,在与插入、更新、删除相关的事件教程中,我们将BoundField 的 DataFormatString 属性赋值为{0:c} ,令它变为货币格式。此外, 我们将ApplyFormatInEditMode 属性赋值为 true ,这导致GridView 的编辑界面将 UnitPrice 显示为货币格式。将 BoundField 转换为 TemplateField 时,Visual Studio 注意到了这些设置,所以使用数据绑定语法 <%# Bind("UnitPrice", "{0:c}") %> ,将TextBox 的 Text 属性设为货币格式。

图8 :无效输入时,文本框旁边显示一个星号

尽管验证仍然起作用,但是用户编辑记录时必须手工删除货币符号,这让人无法接受。为了解决这个问题,我们有三个选择:

  1. 配置 EditItemTemplate ,使得 UnitPrice 值不是货币格式。
  2. 允许用户输入货币符号,方法是删除 CompareValidator ,并替换为 RegularExpressionValidator ,它能对正确的货币格式值进行合适的检查。这里的问题是,用来验证货币值的正则表达式不太完备,如果我们想包括区域设置,就需要编写代码。
  3. 完全删除验证控件,寄希望于服务器端 GridView 的 RowUpdating event handler 中的验证逻辑。

对于本练习,我们使用第1 个选择。目前,UnitPrice 是货币格式,原因是EditItemTemplate 中 TextBox 的数据绑定表达式:<%# Bind("UnitPrice", "{0:c}") %> 。将 Bind 语句改为 Bind("UnitPrice", "{0:n2}") , 就可以将结果转化为数值格式,精确度为两位数。要做到这点,可以直接通过声明式语法, 或者单击UnitPrice TemplateField 的 EditItemTemplate 中 EditUnitPrice TextBox 的 Edit DataBindings 链接 ( 见图9 与图10 ) 。

图9 :单击 TextBox 的 Edit DataBindings 链接

图10 :在 Bind 语句中指定格式规范

更改后,正在编辑界面中的格式化价格包含有逗号作为组分隔符,句号作为小数点分隔符,但停止使用货币符号。

注意:UnitPrice EditItemTemplate 不包括 RequiredFieldValidator ,这允许发生回传以及启动更新逻辑。然而,从对深入了解与插入、更新、删除相关的事件教程中复制过来的RowUpdating event handler 包括了程序检查,它能确保提供了 UnitPrice 。可删除或保留这一逻辑,或向UnitPrice EditItemTemplate 添加一个RequiredFieldValidator 。

步骤4 : 汇总数据输入问题

除了五个验证控件,ASP.NET 还包含ValidationSummary 控件 ,该控件显示检测到无效数据的验证控件的错误消息。该汇总数据可以在网页上以文本方式显示,也可以通过模式客户端消息框显示。我们来增强本教程的功能,使其包含一个能对所有验证问题进行汇总的客户端消息框。

为此,需要从工具箱拖拉一个 ValidationSummary 控件到 Designer 。Validation 控件的位置其实并不重要,因为我们将会对它配置为一个显示汇总信息的消息框。添加完该控件之后,将它的 ShowSummary 属性 赋值为 false ,其ShowMessageBox 属性 赋值为 true 。通过这些添加,所有验证错误都会汇总到客户端的消息框中。

图11 :验证错误被汇总到客户端的消息框中

步骤5:向 DetailsView 的InsertItemTemplate 添加验证控件

本教程的其余部分是向 DetailsView 的插入界面添加验证控件。为DetailsView 的模板添加验证控件的过程与步骤3 相同;因此,可轻松完成本步骤中的任务。正如我们对GridView 的 EditItemTemplate 操作那样,鼓励将TextBox 的 ID 重命名,将没什么特点的 TextBox1 与 TextBox2 改为 InsertProductName 与InsertUnitPrice 。

为ProductName InsertItemTemplate 添加一个 RequiredFieldValidator 。将 ControlToValidate 赋值为模板中 TextBox 的 ID ,将其 Text 属性赋值为 “* ”,并 将其 ErrorMessage 属性赋值为 “You must provide the product's name ” 。

因为添加新记录时需要为本页面提供 UnitPrice ,所以为 UnitPrice InsertItemTemplate 添加一个RequiredFieldValidator ,并为其 ControlToValidate 、Text 、ErrorMessage 属性进行正确赋值。最后,也为 UnitPrice InsertItemTemplate 添加一个 CompareValidator ,并对其ControlToValidate 、Text 、ErrorMessage 、Type 、Operator 、ValueToCompare 属性进行配置,同GridView 的 EditItemTemplate 中 UnitPrice 的 CompareValidator 配置方法 。

添加完这些验证控件之后,如果没有提供产品名称,或者产品价格是负数,或格式不对,那么新产品就无法添加到系统。

图12 :已添加到 DetailsView 的插入界面的验证逻辑

步骤6 :将验证控件分组

我们的页面包含两组逻辑独立的验证控件:一组对应于GridView 的编辑界面,一组对应于 DetailsView 的插入界面。默认情况下,当发生回传时,页面上的 所有验证控件都会执行检查。然而,当编辑记录时,我们并不希望 DetailsView 的插入界面的验证控件执行验证。图 13 说明了我们现在两难境地:当用户使用完全合法的值编辑产品时,单击 Update 却会导致验证错误,原因是插入界面中的名称与价格值为空。

图13 :更新产品却触发插入界面的验证控件

ASP.NET 2.0 中的验证控件可通过其 ValidationGroup 属性分为验证组。要将一系列验证控件归为一组,只需 将它们的ValidationGroup 属性设为相同的值就可以了。对我们的教程而言,需要将 GridView 的TemplateField 中验证控件的ValidationGroup 属性赋值为EditValidationControls ,将 DetailsView 的TemplateField 的 ValidationGroup 属性赋值为InsertValidationControls 。可以直接在声明式标记中进行这些更改,或者在使用 Designer 的编辑模板界面时通过 Properties 窗口进行更改。

除了验证控件之外,ASP.NET 2.0 中 Button 还有与 Button 相关的控件也包含ValidationGroup 属性。当某个 Button 引起回传时,只有与它具有相同 ValidationGroup 属性设置的验证组成员才会进行验证。例如,如果让 DetailsView 的 Insert 按钮触发 InsertValidationControls 验证组,我们需要将CommandField 的 ValidationGroup 属性赋值为InsertValidationControls (见图14)。此外,将 GridView 的 CommandField 的ValidationGroup 属性赋值为 EditValidationControls 。

图14 :将 DetailsView 的 CommandField 的 ValidationGroup 属性赋值为InsertValidationControls

进行完这些更改之后,DetailsView 与 GridView 的 TemplateField 与CommandField 应如下所示 :

DetailsView 的TemplateField 与 CommandField :

<asp:TemplateField HeaderText="ProductName"
  SortExpression="ProductName">
    <InsertItemTemplate>
        <asp:TextBox ID="InsertProductName" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2"
          runat="server" ControlToValidate="InsertProductName"
            ErrorMessage="You must provide the product name"
            ValidationGroup="InsertValidationControls">*
        </asp:RequiredFieldValidator>
    </InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice">
    <InsertItemTemplate>
         <asp:TextBox ID="InsertUnitPrice" runat="server"
           Text='<%# Bind("UnitPrice") %>' Columns="6">
         </asp:TextBox>
         <asp:RequiredFieldValidator ID="RequiredFieldValidator3"
           runat="server" ControlToValidate="InsertUnitPrice"
            ErrorMessage="You must provide the product price"
            ValidationGroup="InsertValidationControls">*
         </asp:RequiredFieldValidator>
        <asp:CompareValidator ID="CompareValidator2" runat="server"
           ControlToValidate="InsertUnitPrice"
           ErrorMessage="The price must be greater than or equal to zero and
                          cannot include the currency symbol"
           Operator="GreaterThanEqual" Type="Currency" ValueToCompare="0"
           ValidationGroup="InsertValidationControls">*
        </asp:CompareValidator>
     </InsertItemTemplate>
 </asp:TemplateField>
<asp:CommandField ShowInsertButton="True"
  ValidationGroup="InsertValidationControls" />

GridView 的 CommandField 与 TemplateField :

<asp:CommandField ShowEditButton="True" ValidationGroup="EditValidationControls" />
<asp:TemplateField HeaderText="ProductName"
  SortExpression="ProductName">
    <EditItemTemplate>
        <asp:TextBox ID="EditProductName" runat="server"
          Text='<%# Bind("ProductName") %>'>
        </asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1"
            runat="server" ControlToValidate="EditProductName"
            ErrorMessage="You must provide the product name"
            ValidationGroup="EditValidationControls">*
        </asp:RequiredFieldValidator>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("ProductName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice">
    <EditItemTemplate>
        <asp:TextBox ID="EditUnitPrice" runat="server"
          Text='<%# Bind("UnitPrice", "{0:n2}") %>' Columns="6"></asp:TextBox>
        <asp:CompareValidator ID="CompareValidator1" runat="server"
            ControlToValidate="EditUnitPrice"
            ErrorMessage="The price must be greater than or equal to zero and
                           cannot include the currency symbol"
            Operator="GreaterThanEqual" Type="Currency"
            ValueToCompare="0"
            ValidationGroup="EditValidationControls">*
        </asp:CompareValidator>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label2" runat="server"
            Text='<%# Bind("UnitPrice", "{0:c}") %>'>
        </asp:Label>
    </ItemTemplate>
</asp:TemplateField>

此时,与编辑相关的验证控件仅当单击GridView 的 Update 按钮时才会触发,与插入相关的验证控件仅当单击DetailsView 的 Insert 按钮时才会触发,这就解决了图 13 中突显的问题。然而,进行这一更改之后,当输入无效数据时,我们的 ValidationSummary 控件就不再显示了。 ValidationSummary 控件也包含 ValidationGroup 属性,它只为自己验证组中的那些验证控件显示汇总信息。因此,我们在本页面中需要有两个验证控件,一个针对 InsertValidationControls 验证组,一个则针对 EditValidationControls 。

<asp:ValidationSummary ID="ValidationSummary1" runat="server"
    ShowMessageBox="True" ShowSummary="False"
    ValidationGroup="EditValidationControls" />
<asp:ValidationSummary ID="ValidationSummary2" runat="server"
    ShowMessageBox="True" ShowSummary="False"
    ValidationGroup="InsertValidationControls" />

将这加入之后,我们的教程就完成了!

小结

虽然BoundField 可以提供插入与编辑界面,但是这种界面无法自定义。一般情况下,我们希望为编辑与插入界面添加验证控件,以确保用户的输入合法。为此,我们必须将BoundField 转换为 TemplateField ,并向适当的模板添加验证控件。在本教程中,我们扩充了深入了解与插入、更新、删除相关的事件教程中的示例,向DetailsView 的插入界面与 GridView 的编辑界面都添加了验证控件。此外,我们了解了如何使用 ValidationSummary 控件来显示汇总的验证信息,以及如何将页面上的验证控件分为不同的验证组。

正如本教程中所介绍的,TemplateField 允许扩充编辑与插入界面,以包含验证控件。还可以扩充 TemplateField ,以包含更多的输入Web 控件,从而由更适合的Web 控件 来替换TextBox 。下一篇教程中,我们将介绍如何将 TextBox 控件替换为数据绑定的 DropDownList 控件(该控件最适合用于编辑外键,如Products 表中的 CategoryID 或SupplierID )。

快乐编程 !





下一篇教程