已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在ASP.NET 2.0中操作数据之四十:自定义DataList编辑界面作者:heker2007 字体:增加减小 类型:转载 时间:2016-05-12我要评论先前的编辑界面清一色的都是TextBox控件,当然EditItemTemplate还可以包含很多其他的控件,比如DropDownLists, RadioButtonLists, Calendars等,这一节就让我们看看如何实现添加其他的控件。导言DataList的编辑界面由EditItemTemplate里的标记语言和web控件定义。在目前为止所做的DataList编辑功能的例子里,编辑界面都只包含TextBox。在前面一章里,我们通过添加验证控件来增加了用户体验,提高了可用性。EditItemTemplate可以包含除了TextBox以外的很多控件,比如DropDownList, RadioButtonList, Calendar等。和使用TextBox一样,使用这些控件自定义编辑界面时,步骤如下:为EditItemTemplate添加控件.使用绑定语法将相关的字段值赋给控件的属性.在UpdateCommand事件处理里, 编程访问web控件的值,并将它传给相关的BLL的方法.本章我们将为DataList创建一个更丰富的编辑界面,它将包含DropDownList和CheckBox。我们将创建一个列出product信息的DataList,用户可以更新它的name,supplier,category和discontinued status。见图1。图 1: 编辑界面包含一个TextBox, 两个 DropDownLists和一个CheckBox第一步: 显示Product 信息在创建DataList的编辑界面前,我们需要先创建一个只读界面。先打开EditDeleteDataList文件夹下的CustomizedUI.aspx页,拖一个DataList进来,将ID设为Products。通过DataList的智能标签,创建一个名为ProductsDataSource的ObjectDataSource,用ProductsBLL类的GetProducts方法配置它。象前面一章一样,我们将直接通过BLL来更新product信息。在UPDATE,INSERT,DELETE标签里选择None.图 2: 在UPDATE, INSERT, DELETE 标签的下拉列表里选择 (None)配置完ObjectDataSource后,Visual Studio会自动创建默认的ItemTemplate,列出每个字段的值。将product name用表示,并添加一个Edit button,确保将它的CommandName属性设为 “Edit”. 我的标记语言如下:?123456789101112131415161718192021222324252627282930313233343536373839asp:Label ID=ProductNameLabel runat=serverText= /Category:asp:Label ID=CategoryNameLabel runat=serverText= /Supplier:asp:Label ID=SupplierNameLabel runat=serverText= /Discontinued:asp:Label ID=DiscontinuedLabel runat=serverText= /Price:asp:Label ID=UnitPriceLabel runat=serverText= /上面的标记语言用表示product name,4列的展示其它字段。前面已经讨论过Styles.css里定义的ProductPropertyLabel和productPropertyValue类。浏览该页,见图3。图 3: 显示product信息第二步: 为编辑界面添加web控件首先向EditItemTemplate里添加需要的web控件。我们需要用一个DropDownList表示category,一个DropDownList表示supplier,一个CheckBox 表示discontinued state。由于本例中不用编辑price,所以仍然用Label来表示它。点击DataList的智能标签上的“Edit Templates”,选择EditItemTemplate,为它添加一个ID为Categories的EditItemTemplate。图 4: 为Categories添加一个DropDownList然后从DropDownList的智能标签里选择“Choose Data Source”,创建一个名为CategoriesDataSource的ObjectDataSource。用CategoriesBLL类的GetCategories()方法配制它(见图5)。数据源配置向导会要求为ListItem Text和Value选择字段。让DropDownList 显示CategoryName,CategoryID作为Value,见图6。图 5: 创建 ObjectDataSource图 6: 配置DropDownList的 Display 字段和Value 字段重复上面的步骤,为suppliers创建一个ID为Suppliers的DropDownList 和一个名为SuppliersDataSource的ObjectDataSource。然后为discontinued state 添加一个CheckBox ,为name添加一个TextBox 。将他们的ID分别设为Discontinued和ProductName。为product name添加一个RequiredFieldValidator 确保用户必须提供这个值。最后添加Update 和Cancel button。记得这两个button的CommandName属性必须分别设为“Update” 和“Cancel”。你可以将编辑界面以你喜欢的方式展示。我选择使用和只读界面一样的界面来显示,见下面的声明代码和截图。?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061asp:Label ID=ProductNameLabel runat=serverText= /Name:*Category:Supplier:Discontinued:Price:asp:Label ID=UnitPriceLabel runat=serverText= /图 7: 编辑界面和只读界面的展示差不多第三步: 创建 EditCommand和CancelCommand Event Handlers现在在EditItemTemplate里除了UnitPriceLabel外还没有绑定语法(从ItemTemplate复制过来的代码)。在添加绑定语法前我们首先为DataList的EditCommand和CancelCommand创建事件处理。EditCommand事件处理的目标是为了将Edit button被点击的item展示为编辑状态,而CancelCommand的目标是将DataList返回到编辑前状态。见下面的代码:?123456789101112protected void Products_EditCommand(object source, DataListCommandEventArgs e)/ Set the DataLists EditItemIndex property and rebind the dataProducts.EditItemIndex = e.Item.ItemIndex;Products.DataBind();protected void Products_CancelCommand(object source, DataListCommandEventArgs e)/ Return to DataList to its pre-editing stateProducts.EditItemIndex = -1;Products.DataBind();完成这些后,点击Edit button会进入编辑界面,点击Cancel button会返回只读模式。见图8。由于现在还没有为编辑界面添加绑定语法,TextBox是空白的,CheckBox 未被选中,两个DropDownList里都是第一个item被选中。图 8: 点击Edit Button显示编辑界面第四步: 为编辑界面增加绑定语法为了让编辑界面显示当前product的值,我们需要使用绑定语法将字段的值赋给web控件。绑定语法可以通过选择web控件的智能标签的“Edit DataBindings”或者直接添加声明语法来实现。将ProductName字段的值赋给ProductName TextBox的Text属性,CategoryID和SupplierID字段赋给Categories和Suppliers DropDownList的SelectedValue属性,Discontinued字段赋给Discontinued CheckBox的Checked属性。完成这些后,浏览页面并点击Edit button.见图9。图 9: 点击Edit Button 显示编辑界面第五步: 在UpdateCommand Event Handler保存用户的更改当用户编辑product并点Update button后,会postback并激发UpdateCommand事件。在事件处理里,我们需要从EditItemTemplate里读出web控件的值,并和BLL交互,然后更新数据库里的product。如我们在前面一章看到的那样,被更新的product的ProductID可以通过DataKeys集合来获取。用户输入的值可以通过FindControl(controlID)来编程获取,见下面的代码:?1234567891011121314151617181920212223242526protected void Products_UpdateCommand(object source, DataListCommandEventArgs e)/ Make sure the page is valid.if (!Page.IsValid)return;/ Read in the ProductID from the DataKeys collectionint productID = Convert.ToInt32(Products.DataKeyse.Item.ItemIndex);/ Read in the product name and price valuesTextBox productName = (TextBox)e.Item.FindControl(ProductName);DropDownList categories = (DropDownList)e.Item.FindControl(Categories);DropDownList suppliers = (DropDownList)e.Item.FindControl(Suppliers);CheckBox discontinued = (CheckBox)e.Item.FindControl(Discontinued);string productNameValue = null;if (productName.Text.Trim().Length 0)productNameValue = productName.Text.Trim();int categoryIDValue = Convert.ToInt32(categories.SelectedValue);int supplierIDValue = Convert.ToInt32(suppliers.SelectedValue);bool discontinuedValue = discontinued.Checked;/ Call the ProductsBLLs UpdateProduct method.ProductsBLL productsAPI = new ProductsBLL();productsAPI.UpdateProduct(productNameValue, categoryIDValue, supplierIDValue,discontinuedValue, productID);/ Revert the DataList back to its pre-editing stateProducts.EditItemIndex = -1;Products.DataBind();代码首先检查Page.IsValid属性来确保所有的验证控件都返回合法值。如果Page.IsValid为True,从DataKeys集合里读出被编辑的product 的ProductID的值,并引用EditItemTemplate里的web控件。然后将这些控件的值读到变量里,并传给UpdateProduct方法。完成更新后,DataList会返回到编辑前的状态。注意:我省略了某章异常处理,目的是为了使本章的代码看起来目的性更强。你可以在完成本章后自己添加异常处理的功能作为练习。第六步: 处理空的CategoryID 和SupplierID 值Northwind 数据库允许Products表里的CategoryID和SupplierID列为空。然而我们的编辑界面目前还没有提供可选空值。如果我们试图编辑一个无论是CategoryID还是SupplierID为空的product,将会产生ArgumentOutOfRangeException异常。目前我们也没有将product的category或supplier的值从一个非空值转换为空值的方法。为了在DropDownLists里添加空值,我们需要添加一个ListItem。我将ListItem里的Text显示为(None),你可以将它赋为任何你希望的值(比如空字符串)。最后,记得将DropDownLists的AppendDataBoundItems设为True。如果你没有这么做,绑定到DropDownList 的categories 和suppliers 会被添加的ListItem覆盖。完成这些后,DropDownLists的标记语言看起来应该和下面差不多:?1234567891011asp:DropDownList ID=Categories DataSourceID=CategoriesDataSourceDataTextField=CategoryName DataValueField=CategoryID runat=serverSelectedValue= AppendDataBoundItems=True(None).asp:DropDownList ID=Suppliers DataSourceID=SuppliersDataSourceDataTextField=CompanyName DataValueField=SupplierID runat=serverSelectedValue= AppendDataBoundItems=True(None)注意:为DropDownList 添加ListItems可以通过设计器或者声明语法来完成。当添加一个表示数据库空值的item时,要确保是通过声明语法来完成的。如果你使用设计器的ListItem集合编辑器,当赋空字符串时,产生的声明语法会忽略Value的设置,产生想(None)这样的语句。这个看起来并没有什么关系,但是缺少Value会让DropDownList 使用Text属性的值作为Value。这意味着当NULL ListItem被选择时,“(None)” 会被赋给product的CategoryID或SupplierID字段,这会引起异常。而显式的将Value设为“”,当NULL ListItem被选择时一个空值会被赋给product的CategoryID或SupplierID字段。现在浏览该页。当编辑product时,注意Categories和Suppliers DropDownLists 开头都包含一个“(None)”选项。图 10: Categories 和Suppliers DropDownLists包含 “(None)”为了将“(None)” 保存为数据库NULL值,我们需要回到UpdateCommand事件处理。将categoryIDValue和supplierIDValue变量设为可为空的整型,并在DropDownList的SelectedValue的值不为空字符串时才为它们赋值。?123
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF 2357-2025计量器具数据网络传输要求
- 2026年中国加药装置泵行业市场前景预测及投资价值评估分析报告
- 2026年中国迷你充气泵行业市场前景预测及投资价值评估分析报告
- 2026年中国陆上井口设备行业市场占有率及投资前景预测分析报告
- 2025中国农业科学院统一招聘39人(第三批)考试笔试备考试题及答案解析
- 2026广西南宁市第三人民医院招聘考试笔试模拟试题及答案解析
- 中国国际工程咨询有限公司2026年校园招聘考试笔试备考试题及答案解析
- 纯电动汽车电池及管理系统拆装与检测吉利E450 习题及答案2.1动力电池认知
- 老年人假牙护理
- 2025年科技成果转化合同监管合同协议
- 无机非金属面板保温装饰板外墙外保温系统应用技术规程DB21∕T 3397-2021
- 钢轨探伤发展历程目录一国外钢轨探伤发展二我国钢轨探伤发展
- 部队工程保密协议书
- 物理课程标准2025解读
- 学生学业成绩分析与进步跟踪表
- 全国青少年科技辅导员专业水平认证笔试考题
- 2025年驾驶证资格考试科目一必刷题库及答案(共420题)
- GB/T 45140-2025红树林生态修复监测和效果评估技术指南
- 国开公共部门人力资源管理自检自测1-九
- 2025年中国华电招聘笔试参考题库含答案解析
- 音乐版权授权与管理方案
评论
0/150
提交评论