导言:
在前面的第62章《GridView批量更新数据》里,我们用GridView控件里定制了一个批编辑界面,同样的我们也可以定制一个批添加界面.假设有这种情况,我们接受一批从Tokyo(东京)发过来的货物:6种不同的tea 和 coffee,如果用户在一个DetailsView控件里一次输入一个产品,他将会重复的输入很多相同的值,比如相同的种类(Beverages),相同的供应商(Tokyo Traders),相同的discontinued值(False),以及相同的order值(0).重复性的输入这些相同的值不仅累,还很容易出错.只需额外多做一些工作,我们就可以创建一个批添加界面。用户只需一次行的选择supplier 和category,输入一系列产品的names 和unit prices,再点击一个按钮就可以将这些新产品添加进数据库(如图1所示).这些添加的产品的ProductName 和UnitPrice数据由界面上方的2个DropDownList控件指定,Discontinued 和UnitsOnOrder的值由“硬编辑”指定,分别为false和0.
图1:批添加界面
本教程,我们将创建一个如图1所示的批添加界面。在前面2章的基础上我们将把添加过程用事务封装以保证原子操作.让我们开始吧!
第一步:创建一个展示界面
我们将创建一个包含2个区域的单一页面:展示区域和添加区域.我们在这一步创建的是展示区域,它包含一个用于展示产品的GridView控件以及一个标题为“Process Product Shipment”的button按钮.当点击该按钮时,展示界面将替换为一个如图1所示的添加界面.如果点“Add Products from Shipment” 或 “Cancel”按钮时又会返回展示页面.添加界面将在第二步完成.
这个包含2个界面的页面每次只能让一个界面可见。我们将用2个Panel Web控件作为容器包含这2个界面——一个Panel Web控件包含一个界面.
首先打开BatchData文件夹里的BatchInsert.aspx页面,在设计器模式里从工具箱里拖一个Panel控件到页面(如图2所示),设置其ID为DisplayInterface.当将Panel控件拖到页面时其Height 和 Width属性分别为50px 和 125px.在属性窗口里清除这些属性.
图2:从工具箱里拖一个Panel控件到页面
然后拖一个Button 和 GridView控件到Panel控件里。设Button的ID为ProcessShipment ,Text属性为“Process Product Shipment”. 设GridView的ID为ProductsGrid,从其智能标签里将其绑定到一个名为ProductsDataSource的ObjectDataSource.设置该ObjectDataSource调用ProductsBLL class类的GetProducts方法.由于该GridView控件只用来展示数据,从UPDATE, INSERT, DELETE标签里选“(None)”. 点Finish完成设置
图3:调用ProductsBLL Class类的GetProducts方法来显示数据
图4:在UPDATE, INSERT, DELETE标签里选“(None)”
完成ObjectDataSource设置后,Visual Studio会自动地添加一些BoundFields以及一个CheckBoxField。只保留ProductName, CategoryName, SupplierName, UnitPrice, 以及Discontinued这几列.你可以再做一些外观的改进.我将UnitPrice列定制为货币值,重新对列进行了排序,再对一些列的HeaderText值进行了修改.再在GridView的智能标签里启用了“分页”和“排序”功能.完成上述工作后,页面的声明代码看起来应该和下面的差不多:
<asp:Panel ID="DisplayInterface" runat="server"> <p> <asp:Button ID="ProcessShipment" runat="server" Text="Process Product Shipment" /> </p> <asp:GridView ID="ProductsGrid" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ProductsDataSource"> <Columns> <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" /> <asp:BoundField DataField="CategoryName" HeaderText="Category" ReadOnly="True" SortExpression="CategoryName" /> <asp:BoundField DataField="SupplierName" HeaderText="Supplier" ReadOnly="True" SortExpression="SupplierName" /> <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" HeaderText="Price" HtmlEncode="False" SortExpression="UnitPrice"> <ItemStyle HorizontalAlign="Right" /> </asp:BoundField> <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued"> <ItemStyle HorizontalAlign="Center" /> </asp:CheckBoxField> </Columns> </asp:GridView> <asp:ObjectDataSource ID="ProductsDataSource" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts" TypeName="ProductsBLL"> </asp:ObjectDataSource> </asp:Panel></div>
我们注意到Button 和 GridView控件的声明代码出现在<asp:Panel>标签内部,因为这些控件置于名为DisplayInterface的Panel控件里面,我们可以将Panel控件的Visible 属性设置为false来隐藏这些控件.我们将在第三步看到,当点击一个按钮时,通过编程的方式改变Panel控件的Visible属性以显示添加界面.
花点时间在浏览器里登录该页面.如图5所示,你将看到一个显示为“Process Product Shipment”的button按钮,其下的GridView控件每次列出10个产品.
图5:GridView列出了产品并启用排序和分页功能
第二步:创建添加界面
创建完展示界面后,我们将创建添加界面。在本教程,我们的添加界面允许用户同时添加5个产品,且这5个产品的category 和 supplier是一样的,而names 和 nit price值不同.在ID为DisplayInterface的Panel控件下面,从工具箱里拖一个Panel控件到页面,设置其ID为InsertingInterface,Visible属性为false,并清除其Height 和 Width属性值。我们将在第三步添加代码将其Visible属性改为true.
接下来我们将创建如图1所示的添加界面。该界面本来可以通过一些HTML技术来创建的,不过在这里我们将使用一个很简单的4列7行的table表.
注意:虽然在设计器模式里可以使用工具箱的工具来添加<table> elements元素,不过那样会自动添加一些我们不需要的style属性设置.因此,我更偏向于在源视图模式里添加HTML <table> elements元素. 当写好类<table>声明代码后,我喜欢立即切换到设计器模式,再添加Web控件并设置其属性。当心中有数,已经想好了要创建几行几列的时候,我倾向于使用静态HTML(static HTML)而不是Table Web控件,原因是如果使用Table Web控件的话,我们必须通过FindControl("controlID")的方式来访问放置在里面的的Web控件.不过话又说回来,如果是要创建一个动态变化的表(dynamically-sized tables)的话——比如该表的行和列都绑定到数据库或者基于用户自定义的标准格式,我还是要使用Table Web控件,原因很简单,我们可以通过编程来创建该Table Web控件.
在ID为InsertingInterface的Panel控件的<asp:Panel>标签里输入如下的声明代码:
<table class="DataWebControlStyle" cellspacing="0"> <tr class="BatchInsertHeaderRow"> <td class="BatchInsertLabel">Supplier:</td> <td></td> <td class="BatchInsertLabel">Category:</td> <td></td> </tr> <tr class="BatchInsertRow"> <td class="BatchInsertLabel">Product:</td> <td></td> <td class="BatchInsertLabel">Price:</td> <td></td> </tr> <tr class="BatchInsertAlternatingRow"> <td class="BatchInsertLabel">Product:</td> <td></td> <td class="BatchInsertLabel">Price:</td> <td></td> </tr> <tr class="BatchInsertRow"> <td class="BatchInsertLabel">Product:</td> <td></td> <td class
您可能想查找下面的文章:
- ASP.NET GridView的Bootstrap分页样式
- asp.net实现固定GridView标题栏的方法(冻结列功能)
- 在ASP.NET 2.0中操作数据之六十四:GridView批量添加数据
- 在ASP.NET 2.0中操作数据之六十三:GridView实现批量删除数据
- 在ASP.NET 2.0中操作数据之六十二:GridView批量更新数据
- 在ASP.NET 2.0中操作数据之五十一:从GridView的页脚插入新记录
- 在ASP.NET 2.0中操作数据之四十九:为GridView控件添加RadioButton
- 在ASP.NET 2.0中操作数据之二十八:GridView里的Button
- 在ASP.NET 2.0中操作数据之十五:在GridView的页脚中显示统计信息
- 在ASP.NET 2.0中操作数据之十二:在GridView控件中使用TemplateField