加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在ASP.NET 2.0中操作数据之五十四:添加新记录时包含一个文件上

发布时间:2016-11-22 04:24:27 所属栏目:MsSql教程 来源:站长网
导读:导言: 在前面2节教程,我们探讨了如何使用FileUpload控件从客户端向服务器上传文件,以及如何在数据Web控件里显示二进制数据。 在本节,我们将创建一个web页面以添加新的种类。除了为类的name和description属性添加TextBoxes控件外,我们还要在页面上添加

  那个ID为Categories的GridView控件所使用的名为CategoriesDataSource的 ObjectDataSource控件目前还不支持添加数据。为实现该功能,我们要设置该控件的Insert方法引用类CategoriesBLL的某个方法。具体的讲,我们要用到在第2步里添加的InsertWithPicture方法。

  在ObjectDataSource控件的智能标签里,点“设置数据源”。照原样一直点到“Define Data Methods”界面。再点INSERT标签,从下拉列表里选方法“InsertWithPicture”,点Finish完成设置。

/uploads/allimg/c161121/14OI94521BZ-1433026.gif
图5:设置ObjectDataSource控件使用InsertWithPicture方法

  注意:当完成设置后,Visual Studio会问你是否“刷新Fields and Keys”,选择No,因为如果选Yes的话,将重新构造data Web controls fields,那样将重写所有我们已经定制好的列(field)。

完成设置后,ObjectDataSource控件将会为InsertMethod属性赋值,同时包含一个<InsertParameters>,如下面的声明代码所示:

<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
 OldValuesParameterFormatString="original_{0}" SelectMethod="GetCategories"
 TypeName="CategoriesBLL" InsertMethod="InsertWithPicture">
 <InsertParameters>
 <asp:Parameter Name="categoryName" Type="String" />
 <asp:Parameter Name="description" Type="String" />
 <asp:Parameter Name="brochurePath" Type="String" />
 <asp:Parameter Name="picture" Type="Object" />
 </InsertParameters>
</asp:ObjectDataSource>

第5步:创建一个插入界面

  在教程16《概述插入、更新和删除数据》里我们谈到,当DetailsView控件的数据源控件支持添加功能时,便可以启用DetailsView内置的添加界面。让我们在页面上添加一个DetailsView控件,置于GridView控件之上,并处于添加模式。当在DetailsView控件里添加一个新种类时,其下的GridView控件将自动发生刷新,并将刚添加的类显示出来。

  从工具箱拖一个DetailsView控件到页面,置于GridView之上,设其ID为NewCategory,清空其Height和Width属性。 其智能标签里,设置它绑定到名为CategoriesDataSource的数据源,并启用“插入”功能。

/uploads/allimg/c161121/14OI94524H60-1445N7.gif
图6:将DetailsView控件绑定到CategoriesDataSource,并启用插入功能。

  为使DetailsView呈现为插入界面,设其DefaultMode属性为Insert

  我们注意到,尽管DetailsView控件有5个BoundFields——CategoryID, CategoryName, Description, NumberOfProducts和BrochurePath,但插入界面并不包含CategoryID,因为CategoryID列的InsertVisible属性为false。为什么会显示这4个列呢?因为ObjectDataSource调用的GetCategories()方法返回的就是这些列。当添加新类时,我们不希望用户为NumberOfProducts列指定值,此外,我们还希望让用户为新类上传图片和相关的PDF小册子。

  在DetailsView里将NumberOfProducts列完成删除,再分别CategoryName列和BrochurePath列的HeaderText属性设置为“Category”和“Brochure”。将BrochurePath 转换为TemplateField,再添加一个TemplateField,设其HeaderText属性为“Picture”,把它放置在BrochurePath列和CommandField列之间。

/uploads/allimg/c161121/14OI9452NQ0-1454E5.gif
图7:将DetailsView控件绑定到CategoriesDataSource,并启用插入功能(注:图片说明有误)

  当你在“编辑列”对话框里将BrochurePath BoundField 转换为一个TemplateField后,该TemplateField将包含3个模板:ItemTemplate,EditItemTemplate和InsertItemTemplate,由于我们只需要InsertItemTemplate模板,将另外2个模板删除。如此,你的DetailsView控件的声明代码看起来应该像下面的这样:

<asp:DetailsView ID="NewCategory" runat="server" AutoGenerateRows="False"
 DataKeyNames="CategoryID" DataSourceID="CategoriesDataSource"
 DefaultMode="Insert">
 <Fields>
 <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
  InsertVisible="False" ReadOnly="True"
  SortExpression="CategoryID" />
 <asp:BoundField DataField="CategoryName" HeaderText="Category"
  SortExpression="CategoryName" />
 <asp:BoundField DataField="Description" HeaderText="Description"
  SortExpression="Description" />
 <asp:TemplateField HeaderText="Brochure" SortExpression="BrochurePath">
  <InsertItemTemplate>
  <asp:TextBox ID="TextBox1" runat="server"
   Text='<%# Bind("BrochurePath") %>'></asp:TextBox>
  </InsertItemTemplate>
 </asp:TemplateField>
 <asp:TemplateField HeaderText="Picture"></asp:TemplateField>
 <asp:CommandField ShowInsertButton="True" />
 </Fields>
</asp:DetailsView>

为Brochure和Picture Fields添加FileUpload控件

  当前,BrochurePath TemplateField的InsertItemTemplate模板包含一个TextBox,而Picture TemplateField并不包含任何的模板,我们为这2个TemplateField的InsertItemTemplate模板模板添加FileUpload控件。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读