手机版

在ASP.NET 2.0中操作数据四十:自定义数据列表编辑界面

时间:2021-10-31 来源:互联网 编辑:宝哥软件园 浏览:

介绍

数据列表的编辑界面由标记语言和编辑项目模板中的web控件定义。在到目前为止完成的数据列表编辑功能的例子中,编辑界面只包含文本框。在前一章中,我们添加了验证控件来改善用户体验和可用性。

除了文本框之外,编辑项目模板还可以包含许多控件,如下拉列表、单选按钮列表、日历等。与文本框一样,当使用这些控件自定义编辑界面时,步骤如下:

向编辑项目模板添加控件。使用绑定语法将相关字段值分配给控件的属性。在UpdateCommand事件处理中,以编程方式访问web控件的值,并将它们传递给相关的BLL方法。

在本章中,我们将为数据列表创建一个更丰富的编辑界面,其中将包括DropDownList和CheckBox。我们将创建一个列出产品信息的数据列表,用户可以更新其名称、供应商、类别和停产状态。参见图1。

//files.jb51.net/file_images/article/201605/2016051211162634.png

图1:的编辑界面包含一个文本框、两个下拉列表和一个复选框。

第一步:显示产品信息。

在创建DataList的编辑界面之前,我们需要创建一个只读界面。打开“编辑删除数据列表”文件夹下的CustomizedUI.aspx页面,将数据列表拖入,并将标识设置为“产品”。使用数据列表的智能标记,创建一个名为产品数据源的对象数据源,并使用产品类的获取产品方法对其进行配置。与前一章一样,我们将直接通过BLL更新产品信息。在更新、插入和删除选项卡中选择无。

//files.jb51.net/file_images/article/201605/2016051211162635.png

图2:从更新、插入、删除选项卡的下拉列表中选择(无)。

配置对象数据源后,Visual Studio将自动创建一个默认的项目模板,列出每个字段的值。用h4指示产品名称,并添加一个“编辑”按钮,确保其“命令名称”属性设置为“编辑”。我的标记语言如下:

ItemTemplate h4 asp:Label标签ID=' ProductNameLabel ' runat=' server ' Text=' % # Eval(' ProductName ')% '//H4表边框='0' tr td类=' ProductPropertyLabel ' category3360/TD类=' ProductPropertyValue ' AsP :标签ID=' Categorynamelabel ' runat=' server ' Text=' % # Eval(' Categoryname ')% '//TD类=' ProductPropertyLabel ' Supplier 333333前面已经讨论了在Styles.css中定义的ProductPropertyLabel和productPropertyValue类。浏览这个页面,如图3所示。

//files.jb51.net/file_images/article/201605/2016051211162636.png

图3:显示了产品信息。

步骤:向编辑界面添加web控件。

首先将所需的web控件添加到编辑项目模板中。我们需要为类别使用DropDownList,为供应商使用DropDownList,为停产状态使用CheckBox。由于在这个例子中不需要编辑价格,它仍然由标签表示。

单击数据列表智能标记上的“编辑模板”,选择编辑项目模板,并向其中添加一个类别标识为的编辑项目模板。

//files.jb51.net/file_images/article/201605/2016051211162637.png

图4:为类别添加下拉列表。

然后从控件的智能标签里选择"选择数据源",创建一个名为类别数据源的对象数据源。用类别基地址定位连接类的GetCategories()方法配制它(见图5)。数据源配置向导会要求为列表项文本和价值选择字段。让控件显示类别名称作为价值,见图6。

//files.jb51.net/file_images/article/201605/2016051211162738.png

图5: 创建对象数据源

//files.jb51.net/file_images/article/201605/2016051211162739.png

图6: 配置控件的显示字段和价值字段

重复上面的步骤,为供应商创建一个身份为供应商的控件和一个名为供应商数据源的对象数据源。

然后为停产状态添加一个CheckBox,为名字添加一个文本框。将他们的身份分别设为停止和产品名称。为产品名称添加一个验证确保用户必须提供这个值。

最后添加更新和取消按钮。记得这两个按钮的按钮属性必须分别设为"更新"和取消。你可以将编辑界面以你喜欢的方式展示。我选择使用和只读界面一样的界面来显示,见下面的声明代码和截图。

edititemtaperture H4 asp:标签ID=' ProductNameLabel ' runat='服务器' Text=' % # Eval(' ProductName ')% '//H4表边框='0' tr td类=' ProductPropertyLabel '名称:/TD TD colspan=' 3 '类=' ProductPropertyValue ' ASP : TextBox runat=' Server ' ID=' ProductName ' Width=' 90% '/ASP : requiredfieldvalidator ID=' requiredfieldvrunat=' Server ' */ASP : requiredfieldvalidator/TD/tr TD类=' productproperty标签'类别:/TD类=' ProductPropertyValue ' as p : dropdownlist ID=' Categories ' runat=' Server ' DataSourceID=' Categories data source ' DataTextField=' CategoryName ' DataValueField=' CategoryID '/TD TD类=' productproperty label '供应商:/TD TD类=' productproperty

图7: 编辑界面和只读界面的展示差不多

第三步: 创建编辑命令和取消命令和事件处理程序

现在在编辑模板里除了单价标签外还没有绑定语法(从模板列复制过来的代码)。在添加绑定语法前我们首先为数据列表的编辑命令和取消命令创建事件处理编辑命令事件处理的目标是为了将编辑按钮被点击的项目展示为编辑状态,而取消命令的目标是将数据列表返回到编辑前状态。见下面的代码:

受保护的void Products_EditCommand(对象源,datalistcommanventargs(e){//设置数据列表的编辑项目索引属性并重新绑定数据产品.编辑项目索引=项目。索引产品. DataBind();}受保护的void Products_CancelCommand(对象源,datalistcommanventargs(e){//返回到数据列表到其编辑前状态产品.edititeindex=-1;产品. DataBind();}完成这些后,点击编辑按钮会进入编辑界面,点击取消按钮会返回只读模式。见图8。由于现在还没有为编辑界面添加绑定语法,文本框是空白的检验盒未被选中,两个控件里都是第一个项目被选中。

//files.jb51.net/file_images/article/201605/2016051211162741.png

图8: 点击编辑按钮显示编辑界面

第四步: 为编辑界面增加绑定语法

为了让编辑界面显示当前产品的值,我们需要使用绑定语法将字段的值赋给网控件。绑定语法可以通过选择网控件的智能标签的"编辑数据绑定"或者直接添加声明语法来实现。

将商品名称字段的值赋给商品名称文本框的文本属性,CategoryID和供货商编号字段赋给种类和供应商下拉列表的选择的值属性,已停产字段赋给停产的检验盒的检查属性。完成这些后,浏览页面并点击编辑按钮。见图9。

//files.jb51.net/file_images/article/201605/2016051211162742.png

图9: 点击编辑按钮显示编辑界面

第五步: 在更新命令事件处理程序保存用户的更改

当用户编辑产品并点更新按钮后,会回发并激发更新命令事件。在事件处理里,我们需要从编辑模板里读出网控件的值,并和基地址定位连接交互,然后更新数据库里的产品。如我们在前面一章看到的那样,被更新的产品的商品编号可以通过数据键集合来获取。用户输入的值可以通过FindControl('controlID ')来编程获取,见下面的代码:

受保护的void Products_UpdateCommand(对象源,datalistcommanventargs(e){//确保页面有效.if(!页面IsValid)返回;//从数据键集合中读入ProductID int ProductID=Convert .ToInt32(产品数据键[项目。项目索引]);//读入产品名称和价格值文本框产品名称=(文本框)e .项目。查找控件(' ProductName ');控件类别=(DropDownList)e . item。“查找控件(”类别');控件供应商=(DropDownList)e . item。“查找控件(”供应商');检验盒停产=(CheckBox)e.Item.FindControl('停产');字符串ProductNameValue=null if(ProductName .文本。修剪()。长度0) productNameValue=productName .文字。trim();int categoryIDValue=Convert .ToInt32(类别选定值);int supplierIDValue=Convert .ToInt32(供应商选定值);bool中断值=已停产。已检查;//调用ProductsBLL的更新产品方法.产品bll产品API=新产品bll();产品应用编程接口.UpdateProduct(productNameValue,categoryIDValue,supplierIDValue,discontinuedValue,ProductID);//将数据列表恢复到编辑前的状态产品edititeindex=-1;产品. DataBind();}代码首先检查页面。是否有效属性来确保所有的验证控件都返回合法值。如果页面。是否有效为没错,从数据键集合里读出被编辑的产品的商品编号的值,并引用编辑模板里的网控件。然后将这些控件的值读到变量里,并传给更新产品方法。完成更新后,数据列表会返回到编辑前的状态。

注意:我省略了某章异常处理,目的是为了使本章的代码看起来目的性更强。你可以在完成本章后自己添加异常处理的功能作为练习。

第六步: 处理空的分类编号和供货商编号值

Northwind数据库允许产品表中的类别标识和供应商标识列为空。但是,目前我们的编辑界面不提供可选的空值。如果我们试图编辑一个带有空白类别标识或供应商标识的产品,将会生成一个异常。目前还没有方法将产品的类别或供应商的值从非空值转换为空值。

要向DropDownLists添加空值,我们需要添加一个ListItem。将“我的列表项”中的文本显示为“(无)”,您可以将其分配给任何所需的值(如空字符串)。最后,记住将DropDownLists的AppendDataBoundItems设置为True。如果不这样做,绑定到DropDownList的类别和供应商将被添加的列表项覆盖。完成此操作后,DropDownLists的标记语言应该类似于以下内容:

asp: dropdownlist ID=' Categories ' data sourceid=' Categories data source ' DataTextField=' category name ' DataValueField=' CategoryID ' runat=' server ' Select edValue=' % # Eval(' CategoryID ')% ' AppendDataBoundItems=' True ' asp: listitem=' Selected=' True '(无)/asp: listitem/asp3360 dropdownlist.asp: DropDownList ID=' Suppliers ' data source ID=' suppliiers data source ' DataTextField=' company name ' DataValueField=' suppliierid ' r UNAT=' server ' Selected Value=' % # Eval(' suppliierid ')% ' AppendDataBoundItems=' True ' asp: listitem=' Selected=' True '(None)/asp: listitem/asp3360 DropDownList注意:可以通过设计器将ListItems添加到DropDownList添加表示数据库空值的项时,请确保通过声明语法来完成。如果使用设计器的ListItem集合编辑器,则在分配空字符串时,生成的声明语法将忽略Value的设置,并将生成类似ASP 3360 listitem(无)/ASP 3360 listitem的语句。这似乎无关紧要,但是缺少Value将使DropDownList使用Text属性的Value作为值。这意味着当选择空列表项时,“(无)”将被分配给产品的类别标识或供应商标识字段,这将导致异常。将值显式设置为“”,当选择空列表项时,将为产品的类别标识或供应商标识字段分配空值。现在浏览页面。编辑产品时,请注意“类别”和“供应商下拉列表”在开头都包含一个“(无)”选项。

//files.jb51.net/file_images/article/201605/2016051211162743.png

10:类别和供应商下拉列表包含“(无)”。

要将“(无)”保存为数据库空值,我们需要返回到更新命令事件处理。将categoryIDValue和supplierIDValue变量设置为可空整数,并在DropDownList的SelectedValue的值不是空字符串时为它们赋值。

int?categoryIDValue=nullif(!字符串。IsNullOrEmpty(类别。selected value))categoryid value=Convert。ToInt32(类别。selected value);int?supplierIDValue=nullif(!字符串。IsNullOrEmpty(供应商。selected value))supplierIDValue=Convert。ToInt32(供应商。selected value);完成此操作后,如果用户在DropDownList中选择“(无)”,将向UpdateProduct BLL方法传递一个空值,该值相当于数据库的空值。

摘要

在本章中,我们学习了如何为数据列表创建一个更复杂的编辑界面,该界面包含三个不同的网络控件——一个文本框、两个下拉列表和一个复选框,并且还包含验证控件。创建编辑界面时,无论使用什么控件,步骤都是一样的:首先,为EditItemTemplate添加控件;通过绑定语法将字段值分配给相应web控件的属性;在UpdateCommand事件处理中以编程方式访问web控件及其属性,并将这些值传递给BLL。

创建编辑界面时,无论是仅由TextBox还是不同的web控件组成,都需要确保数据库的NULL值得到正确处理。在处理NULL时,不仅要在编辑界面正确显示已有的NULL值,还要提供一种输入NULL值的方法。对于数据列表中的DropDownLists,这通常意味着添加一个其Value属性显式设置为空字符串(Value=' ')的ListItem,然后在UpdateCommand事件处理中判断是否选择了NULL ListItem。

编程快乐!

作者简介

Scott Mitchell,本系列教程的作者,也是关于ASP/ASP的六本书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。你可以点击查看所有教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望能帮助你学习ASP.NET。

版权声明:在ASP.NET 2.0中操作数据四十:自定义数据列表编辑界面是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。