protected void Categories_RowUpdating(object sender, GridViewUpdateEventArgs e) { // Reference the RadioButtonList RadioButtonList BrochureOptions = (RadioButtonList)Categories.Rows[e.RowIndex].FindControl("BrochureOptions"); // Get BrochurePath information about the record being updated int categoryID = Convert.ToInt32(e.Keys["CategoryID"]); CategoriesBLL categoryAPI = new CategoriesBLL(); Northwind.CategoriesDataTable categories = categoryAPI.GetCategoryByCategoryID(categoryID); Northwind.CategoriesRow category = categories[0]; if (BrochureOptions.SelectedValue == "1") { // Use current value for BrochurePath if (category.IsBrochurePathNull()) e.NewValues["brochurePath"] = null; else e.NewValues["brochurePath"] = category.BrochurePath; } else if (BrochureOptions.SelectedValue == "2") { // Remove the current brochure (set it to NULL in the database) e.NewValues["brochurePath"] = null; } else if (BrochureOptions.SelectedValue == "3") { // Reference the BrochurePath FileUpload control FileUpload BrochureUpload = (FileUpload)Categories.Rows[e.RowIndex].FindControl("BrochureUpload"); // Process the BrochureUpload bool cancelOperation = false; e.NewValues["brochurePath"] = ProcessBrochureUpload(BrochureUpload, out cancelOperation); e.Cancel = cancelOperation; } else { // Unknown value! throw new ApplicationException( string.Format("Invalid BrochureOptions value, {0}", BrochureOptions.SelectedValue)); } if (BrochureOptions.SelectedValue == "2" || BrochureOptions.SelectedValue == "3") { // "Remember" that we need to delete the old PDF file if (category.IsBrochurePathNull()) deletedCategorysPdfPath = null; else deletedCategorysPdfPath = category.BrochurePath; } } protected void Categories_RowUpdated(object sender, GridViewUpdatedEventArgs e) { // If there were no problems and we updated the PDF file, // then delete the existing one if (e.Exception == null) { DeleteRememberedBrochurePath(); } }
注意:RowUpdating事件处理器是如何根据SelectedValue值的不同而使用一系列的条件语句来实现相应的功能。
使用上面的代码,我们就可以编辑一个类了,使用其当前的brochure,或不使用brochure,再或者使用一个新的brochure。在RowUpdating和RowUpdated事件处理器里设置断点(breakpoints)吧,以便更好的理解处理流程。
第7步:上传新图片
Picture ImageField的编辑界面呈现为一个文本框,里面显示的是DataImageUrlField 属性的值。在编辑流程,GridView控件向ObjectDataSource传入一个参数,参数名为ImageField的DataImageUrlField属性;参数值为在编辑界面输入文本框里的值。当图片是存储在文件系统,且DataImageUrlField属性包含的是访问该图片的完整URL时,这样做是恰当的。在这种情况下,在编辑界面里,文本框将会显示图片的URL。毫无疑问,默认的界面不允许用户上传新的图片,但用户却可以修改图片的URL值。不过,在本教程不会出现这种情况,因为Picture数据是直接存储在数据库的,且DataImageUrlField属性被设为CategoryID值。
为了更好的理解在本教程里编辑某行的ImageField时将会发生上什么,我们做如下假设:用户编辑一个CategoryID值为10行,Picture ImageField呈现为一个文本框,显示10,假设用户将其改为50后点Update按钮,页面回传,GridView控件最初产生一个名为CategoryID,值为50的参数。在GridView传递此参数(连同参数CategoryName和参数Description一起)以前,对DataKeys集添加值。因此,将当前行的CategoryID值10,覆盖掉。简言之,ImageField的编辑界面没有对本章教程的编辑流程产生任何影响,因为ImageField的DataImageUrlField属性和DataKey值都是同一个值。
当图片存储在数据库时,ImageField将其显示出来也很容易。不过在编辑界面里我们不需要使用文本框,而提供一个FileUpload控件供最终用户更改图片时使用。与BrochurePath不同,我们不允许类的图片为空——用户要么提供新图片要么使用当前的图片。