在ASP.NET2.0中操作数据之六十四:GridView批量添加数据作者:heker2007字体:[增加减小]类型:转载时间:2016-05-18我要评论前面介绍了批量更新,批量删除数据,这篇文章主要介绍如何实现批量添加数据,当然为了保证数据的完整性,我们在做这些批量操作的时候,都使用了事务来实现。导言:在前面的第62章《GridView批量更新数据》里,我们用GridView控件里定制了一个批编辑界面,同样的我们也可以定制一个批添加界面.假设有这种情况,我们接受一批从Tokyo(东京)发过来的货物:6种不同的tea和coffee,如果用户在一个DetailsView控件里一次输入一个产品,他将会重复的输入很多相同的值,比如相同的种类(Beverages),相同的供应商(TokyoTraders),相同的discontinued值(False),以及相同的order值(0).重复性的输入这些相同的值不仅累,还很容易出错.只需额外多做一些工作,我们就可以创建一个批添加界面。用户只需一次行的选择supplier和category,输入一系列产品的names和unitprices,再点击一个按钮就可以将这些新产品添加进数据库(如图1所示).这些添加的产品的ProductName和UnitPrice数据由界面上方的2个DropDownList控件指定,Discontinued和UnitsOnOrder的值由“硬编辑”指定,分别为false和0.图1:批添加界面本教程,我们将创建一个如图1所示的批添加界面。在前面2章的基础上我们将把添加过程用事务封装以保证原子操作.让我们开始吧!第一步:创建一个展示界面我们将创建一个包含2个区域的单一页面:展示区域和添加区域.我们在这一步创建的是展示区域,它包含一个用于展示产品的GridView控件以及一个标题为“ProcessProductShipment”的button按钮.当点击该按钮时,展示界面将替换为一个如图1所示的添加界面.如果点“AddProductsfromShipment”或“Cancel”按钮时又会返回展示页面.添加界面将在第二步完成.这个包含2个界面的页面每次只能让一个界面可见。我们将用2个PanelWeb控件作为容器包含这2个界面——一个PanelWeb控件包含一个界面.首先打开BatchData文件夹里的BatchInsert.aspx页面,在设计器模式里从工具箱里拖一个Panel控件到页面(如图2所示),设置其ID为DisplayInterface.当将Panel控件拖到页面时其Height和Width属性分别为50px和125px.在属性窗口里清除这些属性.图2:从工具箱里拖一个Panel控件到页面然后拖一个Button和GridView控件到Panel控件里。设Button的ID为ProcessShipment,Text属性为“ProcessProductShipment”.设GridView的ID为ProductsGrid,从其智能标签里将其绑定到一个名为ProductsDataSource的ObjectDataSource.设置该ObjectDataSource调用ProductsBLLclass类的GetProducts方法.由于该GridView控件只用来展示数据,从UPDATE,INSERT,DELETE标签里选“(None)”.点Finish完成设置图3:调用ProductsBLLClass类的GetProducts方法来显示数据图4:在UPDATE,INSERT,DELETE标签里选“(None)”完成ObjectDataSource设置后,VisualStudio会自动地添加一些BoundFields以及一个CheckBoxField。只保留ProductName,CategoryName,SupplierName,UnitPrice,以及Discontinued这几列.你可以再做一些外观的改进.我将UnitPrice列定制为货币值,重新对列进行了排序,再对一些列的HeaderText值进行了修改.再在GridView的智能标签里启用了“分页”和“排序”功能.完成上述工作后,页面的声明代码看起来应该和下面的差不多:?1234567891011121314151617181920212223242526asp:PanelID=DisplayInterfacerunat=serverpasp:ButtonID=ProcessShipmentrunat=serverText=ProcessProductShipment//pasp:GridViewID=ProductsGridrunat=serverAllowPaging=TrueAllowSorting=TrueAutoGenerateColumns=FalseDataKeyNames=ProductIDDataSourceID=ProductsDataSourceColumnsasp:BoundFieldDataField=ProductNameHeaderText=ProductSortExpression=ProductName/asp:BoundFieldDataField=CategoryNameHeaderText=CategoryReadOnly=TrueSortExpression=CategoryName/asp:BoundFieldDataField=SupplierNameHeaderText=SupplierReadOnly=TrueSortExpression=SupplierName/asp:BoundFieldDataField=UnitPriceDataFormatString={0:c}HeaderText=PriceHtmlEncode=FalseSortExpression=UnitPriceItemStyleHorizontalAlign=Right//asp:BoundFieldasp:CheckBoxFieldDataField=DiscontinuedHeaderText=DiscontinuedSortExpression=DiscontinuedItemStyleHorizontalAlign=Center//asp:CheckBoxField/Columns/asp:GridViewasp:ObjectDataSourceID=ProductsDataSourcerunat=serverOldValuesParameterFormatString=original_{0}SelectMethod=GetProductsTypeName=ProductsBLL/asp:ObjectDataSource/asp:Panel2728293031我们注意到Button和GridView控件的声明代码出现在asp:Panel标签内部,因为这些控件置于名为DisplayInterface的Panel控件里面,我们可以将Panel控件的Visible属性设置为false来隐藏这些控件.我们将在第三步看到,当点击一个按钮时,通过编程的方式改变Panel控件的Visible属性以显示添加界面.花点时间在浏览器里登录该页面.如图5所示,你将看到一个显示为“ProcessProductShipment”的button按钮,其下的GridView控件每次列出10个产品.图5:GridView列出了产品并启用排序和分页功能第二步:创建添加界面创建完展示界面后,我们将创建添加界面。在本教程,我们的添加界面允许用户同时添加5个产品,且这5个产品的category和supplier是一样的,而names和nitprice值不同.在ID为DisplayInterface的Panel控件下面,从工具箱里拖一个Panel控件到页面,设置其ID为InsertingInterface,Visible属性为false,并清除其Height和Width属性值。我们将在第三步添加代码将其Visible属性改为true.接下来我们将创建如图1所示的添加界面。该界面本来可以通过一些HTML技术来创建的,不过在这里我们将使用一个很简单的4列7行的table表.注意:虽然在设计器模式里可以使用工具箱的工具来添加tableelements元素,不过那样会自动添加一些我们不需要的style属性设置.因此,我更偏向于在源视图模式里添加HTMLtableelements元素.当写好类table声明代码后,我喜欢立即切换到设计器模式,再添加Web控件并设置其属性。当心中有数,已经想好了要创建几行几列的时候,我倾向于使用静态HTML(staticHTML)而不是TableWeb控件,原因是如果使用TableWeb控件的话,我们必须通过FindControl(controlID)的方式来访问放置在里面的的Web控件.不过话又说回来,如果是要创建一个动态变化的表(dynamically-sizedtables)的话——比如该表的行和列都绑定到数据库或者基于用户自定义的标准格式,我还是要使用TableWeb控件,原因很简单,我们可以通过编程来创建该TableWeb控件.在ID为InsertingInterface的Panel控件的asp:Panel标签里输入如下的声明代码:?1234567891011121314151617181920tableclass=DataWebControlStylecellspacing=0trclass=BatchInsertHeaderRowtdclass=BatchInsertLabelSupplier:/tdtd/tdtdclass=BatchInsertLabelCategory:/tdtd/td/trtrclass=BatchInsertRowtdclass=BatchInsertLabelProduct:/tdtd/tdtdclass=BatchInsertLabelPrice:/tdtd/td/trtrclass=BatchInsertAlternatingRowtdclass=BatchInsertLabelProduct:/tdtd/tdtdclass=BatchInsertLabelPrice:/tdtd/td/trtrclass=BatchInsertRowtdclass=BatchInsertLabelProduct:/tdtd/tdtdclass=BatchInsertLabelPrice:/tdtd/td/trtrclass=BatchInsertAlternatingRowtdclass=BatchInsertLabelProduct:/tdtd/td21222324252627282930313233343536373839404142tdclass=BatchInsertLabelPrice:/tdtd/td/trtrclass=BatchInsertRowtdclass=BatchInsertLabelProduct:/tdtd/tdtdclass=BatchInsertLabelPrice:/tdtd/td/trtrclass=BatchInsertFooterRowtdcolspan=4/td/tr/table该table声明代码里暂时还未包含任何的Web控件。我们注意到每一个trelement元素都有明确的CSSclass设置:放置名为supplier和category的D