手机版

ASP.NET 2.0中的数据操作八:两级下拉列表过滤的主/从报告

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

介绍

在上一个指南中,我们研究了如何显示一个简单的主/从报告,它使用DropDownList和GridView控件,DropDownList填充类别,GridView显示选定类别的产品。这种报表非常适合显示一对多关系的记录,也可以很容易的扩展到显示多个一对多关系的数据。例如,订单系统应该包含代表客户、订单和订单详细信息的表格。一个客户可能有多个订单,每个订单包含多个订单项目。这样的数据可以通过使用两个DropDownLists和一个GridView呈现给用户。第一个DropDownlist应该包含数据库中所有客户的列表。第二个DropDownList的内容是所选客户的订单。GridView用于列出所选订单的订单详细信息。步骤1:创建DropDownList,并用类别数据填充它。

我们的第一个目标是添加一个可以列出类别的DropDownList。这些步骤在之前的指南中已经详细分析过了,但为了保持本指南的完整性,有必要在此简要总结一下。

在“筛选”文件夹中打开MasterDetailsDetails.aspx,在页面上添加DropDownList,将其ID设置为Categories,然后单击智能标记上的“配置数据源”链接。选择在数据源配置向导中添加新数据源。

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

图1:向DropDownList添加了一个新的数据源。

当然,新的数据源应该是ObjectDataSource。命名新的对象数据源类别数据源,让他调用类别BLL对象的GetCategories()方法。

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

图2:选择使用CategoriesBLL类。

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

图3:使用GetCategories()方法配置对象数据源。

配置ObjectDataSource之后,我们还需要指定要在DropDownList中显示的数据字段,并将该数据字段指定为列表项的值。我们指定CategoryName作为要显示的列,CategoryID作为数据项的值字段。

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

图4:指定DropDownList显示类别名称列,并使用类别名称列作为数据项的值。

此时,我们有一个DropDownList控件,它填充了类别表中的记录。当用户在DropDownList中选择一个新类别时,我们需要一个回发,这样我们就可以刷新我们将在第二步中创建的产品DropDownList控件。因此,在categoriesDropDownList的智能标记上选择了AutoPostBack选项。

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

图5:选择类别自动回写下拉列表。

步骤2:在第二DropDownList中显示所选类别的产品。

类别下拉列表完成后,下一步是显示属于所选类别的产品。要完成此功能,请添加一个DropDownList控件,并将其命名为ProductsByCategory。像类别下拉列表一样,为productsbycategorydownlist创建一个新的对象数据源,并将其命名为product by category data source。

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

图6:为产品类别下拉列表添加新的数据源。

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

图7:创建一个新的对象数据源,并将其命名为ProductsByCategoryDataSource。

由于ProductsByCategory DropDownList需要显示属于所选类别的产品,因此让ObjectDataSource调用ProductsBLL对象的getproductbycategoryid(categoryid)方法。

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

图8:选择使用产品类。

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

图9:使用getproductbycategoryid(Categoryid)方法配置对象数据源。

在向导的最后一步,您需要指定categoryID的值。我们将类别下拉列表中选择的数据项作为参数值。

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

图10:使用categoryID参数从类别下拉列表中接收值。

完成ObjectDataSource配置后,剩下的就是指定要在DropDownList中显示的字段以及作为值的字段。设置为显示ProductName,并将ProductID作为值字段。

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

图11:指定了DropDownList数据项的文本和值所使用的数据源字段。

ObjectDataSource和ProductsByCategory DropDownList配置完成后,页面上会出现两个DropDownList:第一个列出所有类别,第二个列出属于所选类别的产品。当用户在第一个DropDownList上选择一个新类别时,将发生回发,第二个DropDownList将被重新绑定以显示属于新选择类别的产品。图12和图13显示了在浏览器中看到的MasterDetailsDetails.aspx页面。

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

图12:第一次访问页面时,选择饮料类别。

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

图13:当选择不同的类别时,显示该类别的产品。

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

图14:激活产品类别下拉列表的自动回写属性。

步骤3:使用详细视图显示所选产品的详细信息。

最后一步是在DetailsView中显示所选产品的详细信息。要完成此功能,请向页面添加一个DetailsView,并将其标识属性设置为ProductDetails。给它一个新的对象数据源。将ObjectDataSource配置为通过ProductsBLL类的getproductbyproductID(productID)方法填写数据,并将productbycategordropdownlist的选定项值用作product id参数的值。

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

图15:选择使用产品类。

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

图16:将对象数据源配置为使用GetProductByProductID(ProductID)方法。

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

图17:使用ProductsByCategory DropDownList的值作为productID参数的值。

您可以选择DetailsView中显示的任何有效字段。我决定不显示产品标识、供应商标识、类别标识字段,而是对其他字段进行重新排序和格式化。此外,我删除了DetailsView的“高度”和“宽度”属性设置,允许DetailsView扩展到所需的宽度,这将比将其限制在指定的大小更好地显示数据。这里是所有的标记语言。

asp3360 detailsview ID=' Product details ' runat=' server ' AutoGenerateRows=' False ' DataKeyNames=' ProductID ' data sourceid=' objectdata source 1 ' EnableViewStat e=' False ' field sasp 3360 boundfield data field=' Product name ' header text=' Product ' sort expression=' Product name '/asp: boundfield data field=' CategoryName ' header text=' Category ' ReadOnly=' True ' sort expression=' Category '乍一看,似乎一切都在按预期进行,但有一个小问题。当您选择一个新类别时,产品分类下拉列表将更新并显示所选类别的产品。但是,ProductDetails DetailsView仍然显示以前产品的信息。选择所选类别的不同产品时,应更新DetailsView。此外,如果你的测试足够彻底,你会发现如果你一直选择新的类别(比如在类别下拉列表中选择饮料,然后是调味品,然后是限制)。每个类别的糖果将刷新产品详细信息视图。

为了让这个问题更具体,我们来看一个例子。当您第一次访问该页面时,饮料类别被选中,相关产品在产品分类下拉列表中列出。Chai是当前选中的产品,它的详细信息显示在ProductDetails DetailsView中,如图18所示。

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

图18: DetailsView显示了所选产品的详细信息。

如果您将类别选项“饮料”更改为“调味品”,则会发生回发,并且ProductsByCategory DropDownList也会相应更新,但DetailsView仍会显示柴的详细信息。

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

图19:最后选择的产品的细节仍然显示。

选择列表中的产品将按预期刷新DetailsView。如果您更改产品并选择一个新类别,DetailsView将不会再次刷新。然后,如果您选择一个新的类别而不是产品,DetailsView将会刷新。这是怎么回事?

这个问题是由页面生命周期的时间调度引起的。当页面被请求时,它将在一系列过程之后呈现。其中一个过程是ObjectDataSource控件检查其SelectParameters值是否更改。如果更改,由WEB控件绑定到ObjectDataSource的数据将被刷新和显示。例如,当选择新类别时,productbycategorydata source objectdata source发现其参数值已更改,然后ProductSBYCategorydownList将被重新绑定以获取所选类别的产品。

在这种情况下,出现问题是因为在页面的生命周期中,ObjectDataSources检查参数是否已更改的操作是在关联的WEB控件被重新绑定之前。因此,当选择新类别product by category data source objectdata source时,它将检查其参数值是否已更改。但是,产品详细信息视图使用的对象数据源没有变化。由于产品分类下拉列表尚未重新绑定,因此产品分类下拉列表将在以后的生命周期中重新绑定到其对象数据源。获取刚刚选择的类别的产品。当productsbycategordropdownlist的值更改时,productDetailsView的ObjectDataSource已完成检查其参数值。因此,detailsview仍然显示以前的数据。图20描述了交互过程。

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

图2033 360t产品详细信息视图的ObjectDataSource检查后,productsbycategordropdownlist的值才发生变化。

为了解决这个问题,我们需要在绑定ProductsByCategory DropDownList之后显式地重新绑定ProductDetails DetailsView。我们可以在ProductsByCategory DropDownList的数据绑定事件中调用ProductDetails DetailsView。的DataBind()方法。将以下事件处理代码添加到MasterDetailsDetails.aspx页面的后代码类:中。

受保护的void products by CaTEgOry _ DataBond(对象发送者,事件参数e){ ProductDetails。DataBind();}在添加了对ProductDetails DetailsView的DataBind()方法的显式调用后,一切正常。图21强调了这个方法如何解决这个问题。

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

图21:刷新产品详细信息在产品的数据绑定事件中显示的详细信息下拉列表。

DropDownList控件是主/从报告的理想用户界面元素(主记录和从记录之间存在一对多的关系)。在前面的教程中,我们看到了如何使用单个DropDownList来过滤选定的类别。在本教程中,我们使用GridView而不是DropDownList作为产品列表,并使用DetailsView显示所选产品的详细信息。本教程中讨论的概念可以很容易地扩展到包含多个一对多关系的数据模型。例如,客户、订单和订单项目。通常,在一对多关系中,您总是可以使用DropDownList来表示“主”实体(一对多之一,主/从关系的主记录)。

编程快乐!

作者简介

斯科特米切尔,六本关于ASP/ASP的书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。Scott是一名独立的技术顾问、培训师和作家,最近完成了一部即将由Sams出版社出版的新作,24小时内精通ASP.NET 2.0。他的联系电子邮件是[emailprotected],也可以通过他的博客http://scottonwriting.net/.联系到他

版权声明:ASP.NET 2.0中的数据操作八:两级下拉列表过滤的主/从报告是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。