ASP.NET 2.0中的操作数据37:数据列表批量更新
介绍
之前,我们学习了如何创建项目级数据列表。像可编辑的GridView一样,数据列表中的每个项目都包含一个“编辑”按钮,当单击该按钮时,该项目将变得可编辑。当偶尔需要更新时,项目编辑没有错,但在某些情况下,用户需要编辑大量记录。如果一个用户需要编辑多条记录,他会被强制点击编辑,进行修改,然后点击更新,这会阻碍他的工作效率。在这种情况下,一个好的选择是提供一个完全可编辑的数据列表,它的所有项目都处于编辑模式,并且它的所有值都可以通过单击“全部更新”按钮来更新。参见图1。
图1:完全可编辑数据列表的所有项目都可以修改。
在本章中,我们将学习如何创建一个完全可编辑的数据列表,该列表为用户提供更新供应商地址的功能。
第一步:是在数据列表的项目模板中创建一个可编辑的用户界面。
在创建标准的项目级编辑数据列表时,我们使用了两个模板:
项目模板-包含只读用户界面(使用标签显示每个产品的名称和价格)。编辑项目模板-包含一个编辑过的用户界面(两个文本框)。
数据列表的编辑项索引属性指示使用编辑项模板(如果有)显示哪个数据列表项。即ItemIndex的值等于DataList的值,EditItemIndex的DataListItem是使用EditItemTemplate显示的。当一次只编辑一个项目时,这种模式运行良好,但在创建完全可编辑的数据列表时,这种模式不适用。
对于完全可编辑的数据列表,我们需要所有的数据列表项都显示在一个可编辑的界面中。最简单的方法是在项目模板中定义一个可编辑的接口。要修改供应商的地址信息,供应商在可编辑界面中表示为文本,地址、城市和国家的值都用文本框表示。
打开BatchUpdate.aspx页面,添加一个数据列表,并将标识设置为“供应商”。通过智能标记添加名为SuppliersDataSource的ObjectDataSource控件。
图2:创建一个名为SuppliersDataSource的对象数据源。
使用SuppliersBLL类的GetSuppliers()方法来配置ObjectDataSource(参见图3)。与前一章一样,我们将直接使用BLL,而不是使用ObjectDataSource来更新供应商信息。在更新选项卡中选择无(见图4)。
图3:使用GetSuppliers()方法配置ObjectDataSource。
图4:将更新标签设置为无。
向导完成后,Visual Studio将自动生成数据列表的项目模板,以显示标签中的每个数据字段。我们需要修改这个模板来提供一个编辑界面。可以在设计器中通过数据列表智能标记上的编辑模板或直接编写声明语法来自定义项目模板。
创建编辑界面,将供应商名称表示为文本,将地址、城市和国家表示为文本框。完成后,您的声明代码应该类似于以下内容:
asp:目录ID=' Suppliers ' runat=' server ' DataKeyField=' supplierieriid ' DataSourceID=' Suppliers data source '项目模板H4 ASP :标签ID='公司名称标签' runat='服务器' Text=' % # Eval('公司名称' % ')'//H4表边框='0' tr td类='供应商名称'地址:/TD类=' supplieriertpropertyvalue ' ASP : ext box ID=' Address '注意:和前面一章一样,需要为数据列表开启查看状态。
在模板列里我使用了两个新的半铸钢钢性铸铁(铸造半钢)类,SupplierPropertyLabel和SupplierPropertyValue。它们的风格设置和产品属性标签和ProductPropertyValue CSS类一样,并已经加入到Styles.css中。ProductPropertyLabel,1 .供应商属性标签{ font-weight : bold;文本对齐:右侧;}.ProductPropertyValue,1 .SupplierPropertyValue { padding-right : 35px;}完成这些后浏览页面。如图5所示,每个数据列表的项目用文本显示供应商名称,用文本框显示地址,城市和国家。
图5:数据列表里的每个供应者都可编辑
第二步: 增加"全部更新"按钮
图5里显示的信息暂时还没提供更新按钮。完全可编辑的数据列表应该只包含一个"全部更新"按钮,而不是象前面那样,每个项目包含一个按钮。当点击"全部更新"时,数据列表里的所有记录将被更新。本章我们将添加两个"全部更新"按钮-一个在页的上面,一个在下面(两个都提供相同的功能)。
先在数据列表上面添加一个身份为UpdateAll1的按钮。然后在数据列表下面添加身份为更新数据2的按钮。两个纽扣的文本都设为全部更新。最后为两个纽扣的点击事件都创建一个事件处理程序。我们创建一个方法、"更新供应商地址",然后在事件处理中调用它。(而不是在两个事件处理里复制相同的代码)
受保护的void UpdateAll1_Click(对象发送者,事件参数e){ updateall suppliereaddreams();}受保护的void UpdateAll2_Click(对象发送者,事件参数e){ updateall suppliereaddress();} private void updateallsupplierieaddreams(){//todo :编写代码以更新数据列表中的所有供应商地址}图6是添加完"全部更新"按钮后的页面。
图6: 页面添加了两个"全部更新"按钮
第三步: 更新所有的供应商的地址信息
完成了将所有的项目显示为可编辑的界面和添加了"全部更新"按钮后,剩下的事就是写代码执行批量更新。我们需要便利数据列表的项目,调用供应商列表类的更新供应商地址方法。
可以通过数据列表的项目属性来访问数据列表项集合。通过数据列表项的引用,我们可以从数据键集合里获取相关的SuppliserID,并引用模板列里的文本框,见下面的代码:
private void updateallsupplierieaddreams(){//创建供应商列表类的实例供应商sbll供应商SAPI=新供应商sbll();//迭代遍历数据列表的每个条目(供应商中的数据列表条目)。项目){ //从数据键集合中获取供应商id整数供应商id=转换.ToInt32(供应商。数据键[项目.项目索引]);//读入用户输入的值文本框地址=(文本框)项FindControl('地址');文本框城市=(文本框)项目查找控件(“城市”);文本框国家=(文本框)项目FindControl('国家');字符串addressValue=null,cityValue=null,countryValue=nullif(地址。文本。修剪()。长度0)地址值=地址.文字。trim();如果(城市。文本。修剪()。长度0)城市价值=城市.文字。trim();如果(国家。文本。修剪()。长度0)国家价值=国家.文字。trim();//调用供应商列表类的更新供应商地址方法suppliersAPI .更新供应商地址(供应商身份证、地址值、城市值、国家值);}}当用户点击一个"全部更新"按钮时,每个供应商数据列表里的数据列表项都执行更新供应商地址方法,并调用供应商列表类的更新供应商地址方法,将相关的值传过去。如果地址,城市或国家里不输入值,更新供应商地址会接收一个空值(不是空字符串),而相关的字段的结果会是一个数据库空。
注意:你可以添加一个显示的状态标签,当批量更新完成后通过它来提供一些确认信息。只更新地址被修改过的记录
本章使用的批量更新法则为每个数据列表里的供应者调用更新供应商地址方法,无论地址信息是否被修改过。虽然这种盲目的更新一般情况下不会有什么性能问题,但是如果你有做数据库表的审计,那样将会导致很多多余的记录。每次用户点击"全部更新"按钮后,不管用户是否有修改,系统里都会为每个供应者产生一个一条新的审计记录。
ADO .网的日期表和数据适配器类被设计用来支持批量更新那些仅仅被修改,删除或新增的记录数据表。的每个排都有行状态属性来指明这个排是否是新增到数据表或从它里面删除,修改,或没有改变。当数据表刚产生时,所有的排都被标记为未修改的,修改了排的任何列后排会被标记为已修改的。
在供应商列表类里我们首先将供应者的记录读进SuppliersDataTable里然后设置地址,城市和国家列的值来更新指定的供应者的信息,见以下代码:
public bool updatesuppliereaddress(int suppliereid,字符串地址,字符串城市,字符串国家){ Northwind .供应商可提供的供应商=适配器. GetSupplierBySupplieRid(SupplieRid);如果(供应商计数==0) //未找到匹配记录,返回错误的返回假的;否则{北风.供应流程供应商=供应商[0];如果(地址==null)供应商setaddress null();其他供应商。地址=地址;if(城市==null)供应商setcity null();其他供应商。城市=城市;如果(国家==null)供应商setcountrNull();其他供应商。国家=国家;//更新供应商地址相关信息int rowsAffected=适配器.更新(供应商);//如果只更新了一行,则返回true,//否则返回false rowsAffected==1;}}无论值是否有被修改,这段代码都将传入的地址,城市和国家的值赋给SuppliersDataTable的供应流程。这个修改将使供应流程的行状态属性被标记为已修改的。当木豆的更新方法被调用时,它发现供应商行已经被修改了,因此向数据库发送更新命令。
然而,想象一下,当传入的地址、城市和国家值与现有值不同时,我们为该方法添加的代码只将它们分配给SuppliersRow。如果地址、城市和国家未被修改,供应商行的行状态仍被标记为未更改。结果是,当调用DAL的Update方法时,不会修改SuppliersRow,因此不会调用数据库。使用以下代码代替之前的盲赋值:
//只有当值不同时,才给供应商行的列值赋值(地址==null!供应商。IsAddressNull())供应商。setaddress null();else if((地址!=零供应商。IsAddressNull()) ||(!供应商。IsAddressNull()字符串。比较(供应商。地址,地址)!=0))供应商。地址=地址;if (city==null!供应商。IsCityNull())供应商。setcity null();否则如果((城市!=零供应商。IsCityNull()) ||(!供应商。IsCityNull()字符串。比较(供应商。城市,城市)!=0))供应商。城市=城市;if (country==null!供应商。IsCountryNull())供应商。setcountrNull();else if((国家!=零供应商。IsCountryNull()) ||(!供应商。IsCountryNull()字符串。比较(供应商。国家,国家)!=0))供应商。国家=国家;添加这些代码后,DAL的UPDATE方法只在那些更改了与地址相关的值的记录中向数据库发送Update命令。
当然,我们也可以跟踪传入的字段是否与数据库数据不同。如果没有,我们不需要调用DAL的Update方法。当您使用直接数据库命令时,这种方法非常有效,因为直接数据库命令不会检查SuppliersRow来决定是否调用数据库。
注意:每次调用UpdateSupplierAddress方法时,都会调用一次数据库来获取要更新的记录的信息。如果数据被修改,应该再次调用数据库来更新数据。这个过程可以通过创建一个重载的UpdateSupplierAddress方法来优化,该方法接受一个EmployeesDataTable,该表包含BatchUpdate.aspx页面的所有修改。然后它调用数据库一次,以获取供应商表中的所有记录。结果集中只能更新修改后的记录。
摘要
本章学习了如何创建完全可编辑的数据列表。通过它,用户可以快速修改多个供应商的地址信息。首先,我们在数据列表的项目模板中定义了编辑界面——地址、城市和国家都由文本框表示。然后我们在数据列表的上方和下方添加了一个“全部更新”按钮。在用户修改了它并单击了其中一个之后,每个数据列表项将调用SuppliersBLL类的UpdateSupplierAddress方法。
编程快乐!
作者简介
Scott Mitchell,本系列教程的作者,也是关于ASP/ASP的六本书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。你可以点击查看所有教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望能帮助你学习ASP.NET。
版权声明:ASP.NET 2.0中的操作数据37:数据列表批量更新是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。