您现在的位置是:网站首页> 编程资料编程资料

在ASP.NET 2.0中操作数据之二十八:GridView里的Button_自学过程_

2023-05-24 376人已围观

简介 在ASP.NET 2.0中操作数据之二十八:GridView里的Button_自学过程_

导言

  一般控件(比如GridView)显示数据的时候对数据只能读取,而需要处理数据的功能是非常常见的.典型的情况是为每行数据添加一个Button, LinkButton, 或ImageButton . 当点击这些button时,数据会PostBack,执行一些服务器端的代码. 一条条的编辑或删除数据是最常见的情况.实际上,编辑和删除是如此常见,从概述插入、更新和删除数据 开始, 我们可以看到GridView, DetailsView, 和 FormView可以零代码的完成这些功能.

  除了编辑和删除button,GridView, DetailsView, and FormView 也可以包含一些执行自定义服务器端代码的Buttons, LinkButtons, 或 ImageButtons .在这一章我们来看看如何向一个GridView 或 DetailsView 里添加自定义的button.我们还将创建一个根据supplier进行分页的页面.对每个给定的supplier,FormView会显示它的相关信息,外加一个Button .点击这个Button 时,所有相关products会被标记为停止使用.另外,GridView 会列出选定的supplier提供的所有product ,并且每一行会包含“Increase Price”和“Discount Price”两个Button.这两个Button用来提高或降低10%的product单价(见图一).

//img.jbzj.com/file_images/article/201605/201605090907328.png

图 1: FormView和GridView 都包含了执行自定义行为的Button

第一步: 添加一个Button 教程页

  在研究如何添加自定义button之前,我们先花一点时间在网站里创建一些页,这些页会在本指南里用到.先添加一个名为CustomButtons的文件夹,然后添加如下的两个页.添加页的时候确保每页都选择了Site.master作为母板页.

    Default.aspx
    CustomButtons.aspx

//img.jbzj.com/file_images/article/201605/201605090907329.png

图 2: 添加本指南需要的页面

  象其它文件夹一样,CustomButtons 文件夹里的Default.aspx 用来列出教程章节.记得SectionLevelTutorialListing.ascx 这个用户控件提供了这个功能.因此,从解决方案浏览里将这个用户控件拖到页面上.

//img.jbzj.com/file_images/article/201605/2016050909073210.png

图 3: 添加SectionLevelTutorialListing.ascx 用户控件 到Default.aspx

最后,将这些页的地址加到 Web.sitemap 的条目里.在Paging and Sorting 之后添加下面的标记.

修改完Web.sitemap后,在浏览器里看一下本教程站点,现在左边的菜单里包含了编辑,插入,删除教程的项.

//img.jbzj.com/file_images/article/201605/2016050909073311.png

图 4:  Site Map包含了添加自定义button教程

第二步: 添加一个列出 Supplier的FormView

  我们首先来添加一个列出suppliers的FormView .正如在导言里讨论的那样,FormView根据supplier分页,并在GridView显示supplier 提供的所有product .另外FormView 会包含一个Button .当点击时,所有相关products会被标记为停止使用.在我们为FormView添加自定义button之前,我们首先创建显示supplier 信息的FormView .

  打开CustomButtons文件夹里的CustomButtons.aspx 页,从工具箱里拖一个FormView进来,将FormView的ID设置为Suppliers.打开FormView的智能标签,创建一个名为SuppliersDataSource的ObjectDataSource.

//img.jbzj.com/file_images/article/201605/2016050909073312.png

图 5: 创建一个名为SuppliersDataSource的ObjectDataSource

  选择SuppliersBLL 类的GetSuppliers()方法配置ObjectDataSource(见图6).由于这个FormView没有提供修改supplier 信息的界面,所以在UPDATE 标签的下拉列表里选择None.

//img.jbzj.com/file_images/article/201605/2016050909073313.png

图 6: 使用 SuppliersBLL 类的GetSuppliers() 方法配置数据源

  数据源配置完成后,Visual Studio会生成一个InsertItemTemplate,一个EditItemTemplate和一个FormView的ItemTemplate.去掉InsertItemTemplate 和EditItemTemplate ,修改ItemTemplate,让它只显示supplier的公司名,电话号码.最后,在智能标签里选中Enable Paging checkbox 或者设置AllowPaging 属性为True.完成这些后,你的声明标记看起来应该和以下差不多:

Phone:

//img.jbzj.com/file_images/article/201605/2016050909073314.png

图 7: FormView列出当前选定的Supplier的CompanyName and Phone

第三步 : 添加一个GridView,用来列出某个Supplier的所有Product

  在添加“Discontinue All Products”Button 前,先在FormView 下面添加一个GridView . 设置ID 为SuppliersProducts,添加一个名为SuppliersProductsDataSource的ObjectDataSource .

//img.jbzj.com/file_images/article/201605/2016050909073315.png

图 8: 创建一个名为SuppliersProductsDataSource的ObjectDataSource

  选择ProductsBLL 类的GetProductsBySupplierID(supplierID)方法配置ObjectDataSource(见图9).虽然GridView 允许修改product的价格,但是并不使用的GridView自带的编辑或删除功能.因此在UPDATE, INSERT, and DELETE 标签的下拉列表里都选择None.

//img.jbzj.com/file_images/article/201605/2016050909073316.png

图 9: 使用ProductsBLL 类的GetProductsBySupplierID(supplierID) 方法配置数据源

  由于GetProductsBySupplierID(supplierID)有一个输入参数,ObjectDataSource向导会提示我们配置这个参数.为了将SupplierID 从FormView传过来,在参数来源的下来列表里选择Control,在ControlID 下拉列表里选择Suppliers (在第二步里创建的FormView 的ID).

//img.jbzj.com/file_images/article/201605/2016050909073417.png

图 10: 指定 supplierID 参数的来源为Suppliers FormView

  完成了ObjectDataSource 向导后,GridView 里的每一行product会包含一个BoundField 和一个CheckBoxField . 我们来精简一下,只显示Discontinued CheckBoxField,ProductName 和UnitPrice .我们修改UnitPrice 列的格式为货币. 你的GridView 和SuppliersProductsDataSource  ObjectDataSource的声明标记看起来应该和下面差不多:

  现在我们的显示了一个主/从表,用户通过在上面的FormView 里选择一个supplier ,在下方的GridView 里就可以看到这个supplier 提供的products.

图11是在FormView里选择Tokyo Traders supplier 的截图.

//img.jbzj.com/file_images/article/201605/2016050909075018.png

图 11: 在GridView显示选定的Supplier的产品

第四步: 创建DAL和BLL层的停止使用Supplier的所有Products 的方法

  在FormView 添加discontinue button前,我们首先需要在DAL 和BLL 里添加完成这个功能的方法.这个方法的名字为DiscontinueAllProductsForSupplier(supplierID). 当点击FormView的Button 时,我们会调用Business Logic Layer里的这个方法,并将选定的supplier的SupplierID传进去.BLL 会继续调用Data Access Layer的相关方法,这个方法会向数据库提交一个停止使用选定的supplier的products的UPDATE语句

  象在以前的教程里所做的那样,我们使用自底向上的方法,首先创建DAL 的方法,然后是BLL ,最后在 ASP.NET page里实现这个功能.打开App_Code/DAL文件夹里的Northwind.xsd ,为ProductsTableAdapter 添加一个新方法(右键点击ProductsTableAdapter ,选择Add Query).这样弹出TableAdapter Query 的配置向导.首先指定DAL 需要使用的SQL .

//img.jbzj.com/file_images/article/201605/2016050909075019.png

图 12: 使用SQL Statement创建DAL 方法

  接着,向导会询问我们创建哪种类型的query .由于DiscontinueAllProductsForSupplier(supplierID)需要更新Products表,为指定的supplierID 的所有products的Discontinued 字段设置为1,因此我们需要创建一个更新数据的query .

//img.jbzj.com/file_images/article/201605/2016050909075020.png

图 13: 选择UPDATE Query的类型

  下一个向导显示的窗口提供了TableAdapter的已经存在的UPDATE 语句,它会updates 在Products DataTable定义的所有的字段.用下面的语句替换它:

UPDATE [Products] SET
   Discontinued = 1
WHERE SupplierID = @SupplierID

  输入以上语句后点Next,最后一个向导窗口需要输入该方法的名字—DiscontinueAllProductsForSupplier.完成向导后点Finish  button.当你回到DataSet 设计器时你应该可以在ProductsTableAdapter 看到名为DiscontinueAllProductsForSupplier(@SupplierID)的方法.

//img.jbzj.com/file_images/article/201605/2016050909075021.png

图 14: 为 DAL 的方法取名为 DiscontinueAllProductsForSupplier

//img.jbzj.com/file_images/article/201605/2016050909075122.png

  完成Data Access Layer里的DiscontinueAllProductsForSupplier(supplierID)方法后,我们下一步的任务是创建Business Logic Layer里的相应的方法.打开ProductsBLL 类文件,添加以下内容:

 public int DiscontinueAllProductsForSupplier(int supplierID) { return Adapter.DiscontinueAllProductsForSupplier(supplierID); }

  这个方法仅仅是调用DAL里的DiscontinueAllProductsForSupplier(supplierID)方法,并传递提供的supplierID  参数.如果有一些业务规则规定仅仅允许在一定的条件下supplier的products 才能被停止使用,那么这些规则应该写在这里(BLL).

  注意:和ProductsBLL 类的UpdateProduct重载不一样,DiscontinueAllProductsForSupplier(supplierID)的签名不包括DataObjectMethodAttribute 属性(

-六神源码网