午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁(yè) > 知識(shí)庫(kù) > 在ASP.NET 2.0中操作數(shù)據(jù)之五十一:從GridView的頁(yè)腳插入新記錄

在ASP.NET 2.0中操作數(shù)據(jù)之五十一:從GridView的頁(yè)腳插入新記錄

熱門(mén)標(biāo)簽:蘇州如何辦理400電話 聯(lián)通官網(wǎng)400電話辦理 網(wǎng)絡(luò)電話外呼系統(tǒng)上海 西寧呼叫中心外呼系統(tǒng)線路商 地圖標(biāo)注軟件免費(fèi)下載 臨沂智能電話機(jī)器人加盟 百應(yīng)電話機(jī)器人外呼系統(tǒng) 400電話辦理怎么樣 外呼電話機(jī)器人成本

導(dǎo)言:

  正如教程《概述插入、更新和刪除數(shù)據(jù)》里探討過(guò)的一樣, GridView, DetailsView和FormView Web控件都有內(nèi)置的修改數(shù)據(jù)的功能。當(dāng)聲明綁定到數(shù)據(jù)源控件時(shí),可以快速而方便地修改數(shù)據(jù)——甚至不用寫(xiě)一行代碼。不幸的是,只有DetailsView和FormView控件提供了內(nèi)置的插入、編輯、刪除功能,而 GridView控件只支持編輯、刪除功能。不過(guò),稍許努力,我們就能使GridView控件包含一個(gè)插入界面。

  為了給GridView添加插入功能,我們要決定如何添加新記錄:創(chuàng)建插入界面,編碼插入數(shù)據(jù)。在本教程,我們將為GridView的頁(yè)腳行(footer row )添加插入界面(見(jiàn)圖1)。其中每一列包含相應(yīng)的用戶(hù)界面元件(比如在TextBox里輸入產(chǎn)品名稱(chēng),在DropDownLis里選擇供應(yīng)商等等),同時(shí)我們需要一個(gè)"Add"按鈕,當(dāng)點(diǎn)擊時(shí),發(fā)生頁(yè)面回傳,將新記錄添加到表Products里。


圖1:頁(yè)腳行提供了一個(gè)添加新記錄的界面

第一步:在GridView控件里展示產(chǎn)品信息

  首先添加一個(gè)展示產(chǎn)品的GridView控件。打開(kāi)EnhancedGridView文件夾里的InsertThroughFooter.aspx頁(yè)面,在上面添加一個(gè)GridView控件,設(shè)其ID為Products,然后,在其智能標(biāo)簽里綁定到一個(gè)名為ProductsDataSource的ObjectDataSource 。


圖2:創(chuàng)建一個(gè)名為ProductsDataSource的新ObjectDataSource

  設(shè)置該ObjectDataSource調(diào)用ProductsBLL類(lèi)的GetProducts()方法獲取產(chǎn)品信息。在本教程里,我們只關(guān)注于添加插入功能,與編輯和刪除無(wú)關(guān)。所以,確保在“插入”選項(xiàng)卡里選AddProduct()方法。而在“編輯”和“刪除”里選“(None)”。


圖3:將 ObjectDataSource的Insert()方法設(shè)置為AddProduct()


圖4:在UPDATE和DELETE選項(xiàng)里選“(None)”

  完成設(shè)置后,Visual Studio會(huì)自動(dòng)添加相關(guān)列?,F(xiàn)在,我們暫時(shí)不管這些列,在教程后續(xù)部分,我們將移除一些列,因?yàn)樵谔砑有掠涗洉r(shí)我們不需指定這些列的值。

  因?yàn)閿?shù)據(jù)庫(kù)中大概有80個(gè)產(chǎn)品,所以我們最好還是啟用分頁(yè)功能,以便使插入界面更直觀、更易操作。回到頁(yè)面,在GridView的智能標(biāo)簽里啟用分頁(yè)。

現(xiàn)在,GridView和ObjectDataSource的聲明代碼看起來(lái)和下面的差不多:

asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
 DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
 AllowPaging="True" EnableViewState="False">
 Columns>
 asp:BoundField DataField="ProductID" HeaderText="ProductID"
  InsertVisible="False" ReadOnly="True"
  SortExpression="ProductID" />
 asp:BoundField DataField="ProductName" HeaderText="ProductName"
  SortExpression="ProductName" />
 asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
  SortExpression="SupplierID" />
 asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
  SortExpression="CategoryID" />
 asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit"
  SortExpression="QuantityPerUnit" />
 asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
  SortExpression="UnitPrice" />
 asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock"
  SortExpression="UnitsInStock" />
 asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder"
  SortExpression="UnitsOnOrder" />
 asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel"
  SortExpression="ReorderLevel" />
 asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
  SortExpression="Discontinued" />
 asp:BoundField DataField="CategoryName" HeaderText="CategoryName"
  ReadOnly="True" SortExpression="CategoryName" />
 asp:BoundField DataField="SupplierName" HeaderText="SupplierName"
  ReadOnly="True" SortExpression="SupplierName" />
 /Columns>
/asp:GridView>

asp:ObjectDataSource ID="ProductsDataSource" runat="server"
 InsertMethod="AddProduct" OldValuesParameterFormatString="original_{0}"
 SelectMethod="GetProducts" TypeName="ProductsBLL">
 InsertParameters>
 asp:Parameter Name="productName" Type="String" />
 asp:Parameter Name="supplierID" Type="Int32" />
 asp:Parameter Name="categoryID" Type="Int32" />
 asp:Parameter Name="quantityPerUnit" Type="String" />
 asp:Parameter Name="unitPrice" Type="Decimal" />
 asp:Parameter Name="unitsInStock" Type="Int16" />
 asp:Parameter Name="unitsOnOrder" Type="Int16" />
 asp:Parameter Name="reorderLevel" Type="Int16" />
 asp:Parameter Name="discontinued" Type="Boolean" />
 /InsertParameters>
/asp:ObjectDataSource>



圖5:在一個(gè)啟用了分頁(yè)功能的GridView里,顯示產(chǎn)品的所有數(shù)據(jù)項(xiàng)

第2步:添加一個(gè)頁(yè)腳行

  GridView控件包含頁(yè)眉行、數(shù)據(jù)行和頁(yè)腳行。GridView控件ShowHeader和ShowFooter屬性決定了是否顯示頁(yè)眉行和頁(yè)腳行。如果要顯示頁(yè)腳行,我們需要將 ShowFooter屬性設(shè)置為true。如圖6所示:


圖6:設(shè)ShowFooter屬性為T(mén)rue,添加頁(yè)腳行

  我們注意到頁(yè)腳行的背景色是深紅色,這是由于我們?cè)诮坛獭妒褂肙bjectDataSource展現(xiàn)數(shù)據(jù)》里創(chuàng)建了一個(gè)名為DataWebControls的主題,并將其應(yīng)用為所有的頁(yè)面底色。特別的,皮膚文件GridView.skin設(shè)置FooterStyle屬性使用FooterStyle CSS ,其代碼如下:

.FooterStyle
{
 background-color: #a33;
 color: White;
 text-align: right;
}

  注意:在以前的教程我們提到過(guò)使用GridView的頁(yè)腳行。如果不清楚的話,請(qǐng)查閱教程第15章《在GridView的頁(yè)腳中顯示統(tǒng)計(jì)信息》

  設(shè)置ShowFooter屬性為true后,在瀏覽器里觀看效果。當(dāng)前的頁(yè)腳行并不包含任何的文字或Web控件。在第3步,我們將修改其包含相應(yīng)的插入界面。


圖7:頁(yè)腳行顯示為空白

第3步:自定義頁(yè)腳行

  回顧教程《在GridView控件中使用TemplateField》,在那篇教程我們探討了如何對(duì)GridView的某一列使用TemplateFields(而不是BoundFields或CheckBoxFields) ,從而實(shí)現(xiàn)自定義顯示樣式;而在教程《定制數(shù)據(jù)修改界面》里我們看到如何在GridView里使用TemplateFields定制編輯界面。一個(gè)TemplateField是由諸如ItemTemplate、EditItemTemplate等模板構(gòu)成的。比如,ItemTemplate模板顯示的數(shù)據(jù)行為只讀狀態(tài);而EditItemTemplate模板定制了一個(gè)編輯行界面。

  除了ItemTemplate、EditItemTemplate等模板外,TemplateField也包含一個(gè)名為FooterTemplate的模板,它為容器指定頁(yè)腳行。所以我們可以在FooterTemplate模板里添加插入界面要用到的Web控件。讓我們開(kāi)始吧,首先,我們將GridView控件里的所有列轉(zhuǎn)換成TemplateFields。在GridView控件的智能標(biāo)簽里點(diǎn)擊“編輯列”,在左邊選中每個(gè)域,再點(diǎn)擊“Convert this field into a TemplateField” 。


圖8:將每個(gè)域轉(zhuǎn)換為一個(gè)TemplateField

  點(diǎn)擊“Convert this field into a TemplateField”的話,將當(dāng)前類(lèi)型的域轉(zhuǎn)換成相應(yīng)的TemplateField。比如,每個(gè)BoundField將轉(zhuǎn)換成這樣的TemplateField,它的ItemTemplate包含一個(gè)Label控件來(lái)顯示相應(yīng)的數(shù)據(jù)域;它的EditItemTemplate使用一個(gè)TextBox控件來(lái)顯示相應(yīng)的數(shù)據(jù)域。例如,在這里,名為ProductName的BoundField將被轉(zhuǎn)換為如下所示的TemplateField :

asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
 EditItemTemplate>
 asp:TextBox ID="TextBox1" runat="server"
  Text='%# Bind("ProductName") %>'>/asp:TextBox>
 /EditItemTemplate>
 ItemTemplate>
 asp:Label ID="Label2" runat="server"
  Text='%# Bind("ProductName") %>'>/asp:Label>
 /ItemTemplate>
/asp:TemplateField>

  同樣的,名為Discontinued的CheckBoxField轉(zhuǎn)換為T(mén)emplateField后,其ItemTemplate 和 EditItemTemplate 模板都將包含一個(gè)CheckBox Web控件(只是ItemTemplate模板里的CheckBox不可用);而處于“只讀”狀態(tài)的ProductID BoundField轉(zhuǎn)換成TemplateField后,其ItemTemplate 和 EditItemTemplate 模板都包含一個(gè)Label控件。簡(jiǎn)而言之,將GridView里的某一列轉(zhuǎn)換為一個(gè) TemplateField,是定制自定義模板的一種又快又容易的方法,且不會(huì)喪失該列應(yīng)有的功能。

  由于我們不需要GridView支持編輯功能,將每個(gè)TemplateField的EditItemTemplate模板刪除,只留下ItemTemplate模板。完成后, GridView的代碼看起來(lái)應(yīng)和下面的差不多:

asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
 DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
 AllowPaging="True" EnableViewState="False" ShowFooter="True">
 Columns>
 asp:TemplateField HeaderText="ProductID" InsertVisible="False"
  SortExpression="ProductID">
  ItemTemplate>
  asp:Label ID="Label1" runat="server"
   Text='%# Bind("ProductID") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
  ItemTemplate>
  asp:Label ID="Label2" runat="server"
   Text='%# Bind("ProductName") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="SupplierID" SortExpression="SupplierID">
  ItemTemplate>
  asp:Label ID="Label3" runat="server"
   Text='%# Bind("SupplierID") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="CategoryID" SortExpression="CategoryID">
  ItemTemplate>
  asp:Label ID="Label4" runat="server"
   Text='%# Bind("CategoryID") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="QuantityPerUnit"
  SortExpression="QuantityPerUnit">
  ItemTemplate>
  asp:Label ID="Label5" runat="server"
   Text='%# Bind("QuantityPerUnit") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice">
  ItemTemplate>
  asp:Label ID="Label6" runat="server"
   Text='%# Bind("UnitPrice") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="UnitsInStock"
  SortExpression="UnitsInStock">
  ItemTemplate>
  asp:Label ID="Label7" runat="server"
   Text='%# Bind("UnitsInStock") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="UnitsOnOrder"
  SortExpression="UnitsOnOrder">
  ItemTemplate>
  asp:Label ID="Label8" runat="server"
   Text='%# Bind("UnitsOnOrder") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="ReorderLevel"
  SortExpression="ReorderLevel">
  ItemTemplate>
  asp:Label ID="Label9" runat="server"
   Text='%# Bind("ReorderLevel") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="Discontinued"
  SortExpression="Discontinued">
  ItemTemplate>
  asp:CheckBox ID="CheckBox1" runat="server"
   Checked='%# Bind("Discontinued") %>' Enabled="false" />
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="CategoryName"
  SortExpression="CategoryName">
  ItemTemplate>
  asp:Label ID="Label10" runat="server"
   Text='%# Bind("CategoryName") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="SupplierName"
  SortExpression="SupplierName">
  ItemTemplate>
  asp:Label ID="Label11" runat="server"
   Text='%# Bind("SupplierName") %>'>/asp:Label>
  /ItemTemplate>
 /asp:TemplateField>
 /Columns>
/asp:GridView>

  現(xiàn)在, 每個(gè)GridView列都已經(jīng)轉(zhuǎn)換成一個(gè)TemplateField,我們?cè)谄銯ooterTemplate里添加適當(dāng)?shù)牟迦虢缑?。然而,有些列沒(méi)有插入界面(比如ProductID),其它列的TemplateField模板將包含Web控件,供用戶(hù)輸入產(chǎn)品信息。

  在GridView的智能標(biāo)簽里點(diǎn)擊“Edit Templates”,從下拉列表里選擇某列的 FooterTemplate模板,從工具箱里拖一個(gè)適當(dāng)?shù)目丶巾?yè)面上。


圖9:在每列的FooterTemplate里添加適當(dāng)?shù)牟迦虢缑妗?/strong>

下面列出了GridView的所有列,并指定每列添加哪些插入界面:

ProductID – 無(wú)
ProductName –添加一個(gè)TextBox,ID為NewProductName;再添加一個(gè)
RequiredFieldValidator控件,防止用戶(hù)未輸入產(chǎn)品名。
SupplierID –無(wú)
CategoryID – 無(wú)
QuantityPerUnit – 添加一個(gè)TextBox,ID為NewQuantityPerUnit
UnitPrice – 添加一個(gè)TextBox,ID為NewUnitPrice,再添加一個(gè)CompareValidator控件,確保用戶(hù)輸入的是貨幣值,且>=0
UnitsInStock –添加一個(gè)TextBox,ID為NewUnitsInStock,再添加一個(gè)CompareValidator控件,確保用戶(hù)輸入的是整數(shù)值,且>=0
UnitsOnOrder – 添加一個(gè)TextBox,ID為NewUnitsOnOrder,再添加一個(gè)CompareValidator控件,確保用戶(hù)輸入的是整數(shù)值,且>=0
ReorderLevel –添加一個(gè)TextBox,ID為NewReorderLevel,再添加一個(gè)CompareValidator控件,確保用戶(hù)輸入的是整數(shù)值,且>=0
Discontinued–添加一個(gè)CheckBox,ID為NewDiscontinued
CategoryName ––添加一個(gè)DropDownList控件,ID為NewCategoryID。將其綁定到一個(gè)名為CategoriesDataSource的ObjectDataSource控件,設(shè)置它調(diào)用CategoriesBLL類(lèi)的GetCategories() 方法。設(shè)置DropDownList控件顯示CategoryName,并將DropDownList控件的values設(shè)置為CategoryID
SupplierName –添加一個(gè)DropDownList控件,ID為NewSupplierID.將其綁定到一個(gè)名為SuppliersDataSource的ObjectDataSource控件,設(shè)置它調(diào)用SuppliersBLL類(lèi)的GetSuppliers()方法.設(shè)置DropDownList控件顯示CompanyName ,并將DropDownList控件的values設(shè)置為SupplierID.

  將每個(gè)validation控件的ForeColor屬性清空,以便用在FooterStyle CSS類(lèi)定義的白色背景色取代默認(rèn)的紅色;同時(shí)將ErrorMessage設(shè)置為詳細(xì)的錯(cuò)誤提示;將Text屬性設(shè)置為星號(hào)。在每個(gè)FooterTemplates里,只要包含有validation控件,將其Wrap屬性設(shè)置為false。最后,在GridView控件下面添加一個(gè)ValidationSummary 控件,設(shè)ShowMessageBox屬性為true;ShowSummary屬性為false。

  當(dāng)添加一個(gè)新產(chǎn)品時(shí),我們需要給出CategoryID和SupplierID值。頁(yè)面上的2個(gè)DropDownList控件顯示的是CategoryName 和SupplierName,但傳遞的是我們需要的
CategoryID和SupplierID值。為什么不直接顯示CategoryID和SupplierID值呢?因?yàn)樽罱K用戶(hù)對(duì)CategoryName 和SupplierName更感興趣。既然現(xiàn)在可以在顯示CategoryName 和SupplierName的插入界面獲取對(duì)應(yīng)的CategoryID和SupplierID值,我們將CategoryID 和SupplierID 2個(gè)TemplateFields從GridView移除。

  同樣,當(dāng)添加新產(chǎn)品時(shí)我們不需要ProductID,那么我們也可以刪除ProductID TemplateField,不過(guò),在這里我們保留它。除了TextBoxes,DropDownLists、
CheckBoxes以及validation控件外,我們還需要在插入界面添加一個(gè)“Add”按鈕。當(dāng)點(diǎn)擊該按鈕時(shí),將新記錄添加到數(shù)據(jù)庫(kù)。在第4步,我們將在ProductID TemplateField的FooterTemplate模板添加一個(gè)“Add”按鈕。

  按你喜歡的方式改進(jìn)外觀。比如,將UnitPrice值格式化為貨幣形式;將UnitsInStock, UnitsOnOrder和ReorderLevel三列放在右邊;修改TemplateFields的HeaderText屬性等。

  在FooterTemplates里完成插入界面的修改后,移除SupplierID 和 CategoryID TemplateFields,最終,你的GridView控件的聲明代碼看起來(lái)應(yīng)該和下面的差不多:

asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
 DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
 AllowPaging="True" EnableViewState="False" ShowFooter="True">
 Columns>
 asp:TemplateField HeaderText="ProductID" InsertVisible="False"
  SortExpression="ProductID">
  ItemTemplate>
  asp:Label ID="Label1" runat="server"
   Text='%# Bind("ProductID") %>'>/asp:Label>
  /ItemTemplate>
  ItemStyle HorizontalAlign="Center" />
 /asp:TemplateField>
 asp:TemplateField HeaderText="Product" SortExpression="ProductName">
  ItemTemplate>
  asp:Label ID="Label2" runat="server"
   Text='%# Bind("ProductName") %>'>/asp:Label>
  /ItemTemplate>
  FooterTemplate>
  asp:TextBox ID="NewProductName" runat="server">/asp:TextBox>
  asp:RequiredFieldValidator ID="RequiredFieldValidator1"
   runat="server" ControlToValidate="NewProductName"
   Display="Dynamic" ForeColor=""
   ErrorMessage="You must enter a name for the new product.">
   * /asp:RequiredFieldValidator>
  /FooterTemplate>
  FooterStyle Wrap="False" />
 /asp:TemplateField>
 asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
  ItemTemplate>
  asp:Label ID="Label10" runat="server"
   Text='%# Bind("CategoryName") %>'>/asp:Label>
  /ItemTemplate>
  FooterTemplate>
  asp:DropDownList ID="NewCategoryID" runat="server"
   DataSourceID="CategoriesDataSource"
   DataTextField="CategoryName" DataValueField="CategoryID">
  /asp:DropDownList>
  asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
   OldValuesParameterFormatString="original_{0}"
   SelectMethod="GetCategories" TypeName="CategoriesBLL">
  /asp:ObjectDataSource>
  /FooterTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="Supplier" SortExpression="SupplierName">
  ItemTemplate>
  asp:Label ID="Label11" runat="server"
   Text='%# Bind("SupplierName") %>'>/asp:Label>
  /ItemTemplate>
  FooterTemplate>
  asp:DropDownList ID="NewSupplierID" runat="server"
   DataSourceID="SuppliersDataSource"
   DataTextField="CompanyName" DataValueField="SupplierID">
  /asp:DropDownList>asp:ObjectDataSource ID="SuppliersDataSource"
   runat="server" OldValuesParameterFormatString="original_{0}"
   SelectMethod="GetSuppliers" TypeName="SuppliersBLL">
  /asp:ObjectDataSource>
  /FooterTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="Qty/Unit" SortExpression="QuantityPerUnit">
  ItemTemplate>
  asp:Label ID="Label5" runat="server"
   Text='%# Bind("QuantityPerUnit") %>'>/asp:Label>
  /ItemTemplate>
  FooterTemplate>
  asp:TextBox ID="NewQuantityPerUnit" runat="server">/asp:TextBox>
  /FooterTemplate>
 /asp:TemplateField>
 asp:TemplateField HeaderText="Price" SortExpression="UnitPrice">
  ItemTemplate>
  asp:Label ID="Label6" runat="server"
   Text='%# Bind("UnitPrice", "{0:c}") %>'>/asp:Label>
  /ItemTemplate>
  FooterTemplate>
  $asp:TextBox ID="NewUnitPrice" runat="server" Columns="8" />
  asp:CompareValidator ID="CompareValidator1" runat="server"
   ControlToValidate="NewUnitPrice"
   ErrorMessage="You must enter a valid currency value greater than
   or equal to 0.00. Do not include the currency symbol."
   ForeColor="" Operator="GreaterThanEqual" Type="Currency"
   ValueToCompare="0" Display="Dynamic">
   * /asp:CompareValidator>
  /FooterTemplate>
  ItemStyle HorizontalAlign="Right" />
  FooterStyle Wrap="False" />
 /asp:TemplateField>
 asp:TemplateField HeaderText="Units In Stock"
  SortExpression="Units In Stock">
  ItemTemplate>
  asp:Label ID="Label7" runat="server"
   Text='%# Bind("UnitsInStock") %>'>/asp:Label>
  /ItemTemplate>
  FooterTemplate>
  asp:TextBox ID="NewUnitsInStock" runat="server" Columns="5" />
  asp:CompareValidator ID="CompareValidator2" runat="server"
   ControlToValidate="NewUnitsInStock" Display="Dynamic"
   ErrorMessage="You must enter a valid numeric value for units
   in stock that's greater than or equal to zero."
   ForeColor="" Operator="GreaterThanEqual" Type="Integer"
   ValueToCompare="0">*/asp:CompareValidator>
  /FooterTemplate>
  ItemStyle HorizontalAlign="Right" />
  FooterStyle Wrap="False" />
 /asp:TemplateField>
 asp:TemplateField HeaderText="Units On Order" SortExpression="UnitsOnOrder">
  ItemTemplate>
  asp:Label ID="Label8" runat="server"
   Text='%# Bind("UnitsOnOrder") %>'>/asp:Label>
  /ItemTemplate>
  FooterTemplate>
  asp:TextBox ID="NewUnitsOnOrder" runat="server" Columns="5" />
  asp:CompareValidator ID="CompareValidator3" runat="server"
   ControlToValidate="NewUnitsOnOrder" Display="Dynamic"
   ErrorMessage="You must enter a valid numeric value for units on
   order that's greater than or equal to zero."
   ForeColor="" Operator="GreaterThanEqual" Type="Integer"
   ValueToCompare="0">*/asp:CompareValidator>
  /FooterTemplate>
  ItemStyle HorizontalAlign="Right" />
  FooterStyle Wrap="False" />
 /asp:TemplateField>
 asp:TemplateField HeaderText="Reorder Level" SortExpression="ReorderLevel">
  ItemTemplate>
  asp:Label ID="Label9" runat="server"
   Text='%# Bind("ReorderLevel") %>'>/asp:Label>
  /ItemTemplate>
  FooterTemplate>
  asp:TextBox ID="NewReorderLevel" runat="server" Columns="5" />
  asp:CompareValidator ID="CompareValidator4" runat="server"
   ControlToValidate="NewReorderLevel" Display="Dynamic"
   ErrorMessage="You must enter a valid numeric value for reorder
   level that's greater than or equal to zero."
   ForeColor="" Operator="GreaterThanEqual" Type="Integer"
   ValueToCompare="0">*/asp:CompareValidator>
  /FooterTemplate>
  ItemStyle HorizontalAlign="Right" />
  FooterStyle Wrap="False" />
 /asp:TemplateField>
 asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
  ItemTemplate>
  asp:CheckBox ID="CheckBox1" runat="server"
   Checked='%# Bind("Discontinued") %>' Enabled="false" />
  /ItemTemplate>
  FooterTemplate>
  asp:CheckBox ID="NewDiscontinued" runat="server" />
  /FooterTemplate>
  ItemStyle HorizontalAlign="Center" />
  FooterStyle HorizontalAlign="Center" />
 /asp:TemplateField>
 /Columns>
/asp:GridView>

  在瀏覽器里查看該頁(yè)面時(shí),GridView控件的頁(yè)腳行顯示為一個(gè)比較完善的插入界面(如圖10所示)。此時(shí),插入界面并不包含一種方法將輸入的數(shù)據(jù)添加進(jìn)數(shù)據(jù)庫(kù)。并將我們也沒(méi)有闡述那些鍵入的數(shù)據(jù)是如何轉(zhuǎn)換成一條記錄的。在第4步,我們將看到如何添加一個(gè)“Add ”按鈕,在頁(yè)面回傳后如何執(zhí)行代碼。在第5步,我們看如何將鍵入的數(shù)據(jù)轉(zhuǎn)換成一條記錄添加到數(shù)據(jù)庫(kù)。


圖10:GridView的頁(yè)腳行提供了添加新記錄的界面

第4步:在插入界面添加Add按鈕

  如前所述我們需要在界面添加一個(gè)Add按鈕,我們可以在某個(gè)FooterTemplate里或另外增加一列來(lái)放置該按鈕來(lái)達(dá)到這個(gè)目的。在本教程,我們?cè)赑roductID TemplateField的FooterTemplate里添加該按鈕。

  點(diǎn)擊GridView的智能標(biāo)簽中的“編輯模板”,選擇ProductID對(duì)應(yīng)的 FooterTemplate ,添加一個(gè)Button Web控件(LinkButton 或是ImageButton,只要你喜歡), 設(shè)ID為AddProduct;CommandName屬性為Insert;Text屬性為“Add”,如圖11所示:


圖11:將Add Button放在ProductID TemplateField的FooterTemplate模板

  添加按鈕后,在瀏覽器查看該頁(yè)面。如果我們?cè)诮缑孑斎霟o(wú)效的數(shù)據(jù),再點(diǎn)Add按鈕時(shí),頁(yè)面回轉(zhuǎn)中斷,同時(shí)ValidationSummary控件詳細(xì)的列出了那些無(wú)效數(shù)據(jù)(如圖12)。當(dāng)輸入適當(dāng)?shù)臄?shù)據(jù)后,再點(diǎn)按鈕,將引發(fā)頁(yè)面回傳,但是沒(méi)有記錄添加到數(shù)據(jù)庫(kù)里。我們需要編寫(xiě)代碼實(shí)現(xiàn)插入數(shù)據(jù)的功能。


圖12:如果輸入的是無(wú)效數(shù)據(jù),將會(huì)使頁(yè)面回轉(zhuǎn)中斷

注意:界面里的validation控件未被設(shè)置為一組,當(dāng)頁(yè)面中只有插入界面包含validation控件的話,運(yùn)行沒(méi)問(wèn)題。但是,如果在頁(yè)面中還有其它的validation控件的話(比如,如果還存在一個(gè)編輯界面,其中也包含validation控件),我們應(yīng)該將插入界面里的validation控件和Add按鈕的ValidationGroup屬性設(shè)置為同一個(gè)值,使其為一個(gè)特定的確認(rèn)組。

第5步:向表Products添加一條新記錄

  當(dāng)使用GridView控件的內(nèi)置的編輯功能時(shí),GridView會(huì)自動(dòng)的處理編輯產(chǎn)品所必要的工作。當(dāng)點(diǎn)擊編輯按鈕時(shí),它把在編輯頁(yè)面鍵入的數(shù)據(jù)拷貝到ObjectDataSource的UpdateParameters參數(shù)集包含的參數(shù),再調(diào)用ObjectDataSource控件的Update()方法執(zhí)行更新。由于GridView沒(méi)有提供內(nèi)置的功能供插入數(shù)據(jù),我們必須編寫(xiě)代碼調(diào)用ObjectDataSource控件的Insert()方法,將在插入界面鍵入的數(shù)據(jù)復(fù)制到 ObjectDataSource控件的InsertParameters集合里。

  就像在教程28章《GridView里的Button》里探討的一樣,任何時(shí)候,只要點(diǎn)擊 GridView控件里的Button, LinkButton或ImageButton,發(fā)生頁(yè)面回轉(zhuǎn)時(shí)引發(fā)GridView的RowCommand事件。不管這些Button, LinkButton、ImageButton控件是顯式添加的(比如,在頁(yè)腳行添加的Add按鈕),或者是GridView控件自動(dòng)添加的(比如啟用分頁(yè)功能或排序功能時(shí),頂部的出現(xiàn)的那些LinkButton)。

  為相應(yīng)用戶(hù)點(diǎn)擊Add按鈕,我們要為GridView的RowCommand事件創(chuàng)建一個(gè)事件處理器。由于任何時(shí)候點(diǎn)擊GridView控件的任何Button, LinkButton或ImageButton都會(huì)觸發(fā)該事件,我們必須指定當(dāng)傳入事件處理器的CommandName屬性值與Add按鈕的一致時(shí)(即:“Insert”),并且鍵入的數(shù)據(jù)無(wú)誤時(shí),才執(zhí)行插入操作。代碼如下:

protected void Products_RowCommand(object sender, GridViewCommandEventArgs e)
{
 // Insert data if the CommandName == "Insert"
 // and the validation controls indicate valid data...
 if (e.CommandName == "Insert"  Page.IsValid)
 {
 // TODO: Insert new record...
 }
}

  注意:你可能會(huì)很奇怪為什么還要檢查Page.IsValid屬性呢?畢竟,如果在插入界面輸入了無(wú)效的數(shù)據(jù)時(shí),頁(yè)面回傳會(huì)中斷。檢查Page.IsValid屬性是為了防止用戶(hù)未啟用JavaScript或巧妙的繞過(guò)客戶(hù)端驗(yàn)證的情況。簡(jiǎn)而言之,如果沒(méi)有進(jìn)行客戶(hù)端進(jìn)行有效性驗(yàn)證的話,在處理數(shù)據(jù)以前必須在服務(wù)器端再進(jìn)行一次有效性驗(yàn)證。

  在第1步,ObjectDataSource控件ProductsDataSource的Insert()方法映射的是ProductsBLL類(lèi)的AddProduct方法。為了在表Products里添加新記錄,我們只需要簡(jiǎn)單的調(diào)用ObjectDataSource的Insert()方法:

protected void Products_RowCommand(object sender, GridViewCommandEventArgs e)
{
 // Insert data if the CommandName == "Insert"
 // and the validation controls indicate valid data...
 if (e.CommandName == "Insert"  Page.IsValid)
 {
 // Insert new record
 ProductsDataSource.Insert();
 }
}

  現(xiàn)在可以調(diào)用Insert()方法,剩下的步驟是把在插入界面鍵入的值傳遞給ProductsBLL類(lèi)的AddProduct方法中的參數(shù)。就像在教程17章《研究插入、更新和刪除的關(guān)聯(lián)事件》探討的一樣,可以通過(guò)ObjectDataSource控件的Inserting事件來(lái)實(shí)現(xiàn)。在Inserting事件里,我們需要編程訪問(wèn)頁(yè)腳行里的控件,將其值賦給e.InputParameters集合。當(dāng)用戶(hù)忽略了某個(gè)值時(shí)——比如使ReorderLevel文本框?yàn)榭?,我們?yīng)該指定該值為NULL。因?yàn)锳ddProducts方法允許那些nullable類(lèi)型的列接收NULL值。代碼如下:

protected void ProductsDataSource_Inserting
 (object sender, ObjectDataSourceMethodEventArgs e)
{
 // Programmatically reference Web controls in the inserting interface...
 TextBox NewProductName =
 (TextBox)Products.FooterRow.FindControl("NewProductName");
 DropDownList NewCategoryID =
 (DropDownList)Products.FooterRow.FindControl("NewCategoryID");
 DropDownList NewSupplierID =
 (DropDownList)Products.FooterRow.FindControl("NewSupplierID");
 TextBox NewQuantityPerUnit =
 (TextBox)Products.FooterRow.FindControl("NewQuantityPerUnit");
 TextBox NewUnitPrice =
 (TextBox)Products.FooterRow.FindControl("NewUnitPrice");
 TextBox NewUnitsInStock =
 (TextBox)Products.FooterRow.FindControl("NewUnitsInStock");
 TextBox NewUnitsOnOrder =
 (TextBox)Products.FooterRow.FindControl("NewUnitsOnOrder");
 TextBox NewReorderLevel =
 (TextBox)Products.FooterRow.FindControl("NewReorderLevel");
 CheckBox NewDiscontinued =
 (CheckBox)Products.FooterRow.FindControl("NewDiscontinued");

 // Set the ObjectDataSource's InsertParameters values...
 e.InputParameters["productName"] = NewProductName.Text;
 
 e.InputParameters["supplierID"] =
 Convert.ToInt32(NewSupplierID.SelectedValue);
 e.InputParameters["categoryID"] =
 Convert.ToInt32(NewCategoryID.SelectedValue);
 
 string quantityPerUnit = null;
 if (!string.IsNullOrEmpty(NewQuantityPerUnit.Text))
 quantityPerUnit = NewQuantityPerUnit.Text;
 e.InputParameters["quantityPerUnit"] = quantityPerUnit;

 decimal? unitPrice = null;
 if (!string.IsNullOrEmpty(NewUnitPrice.Text))
 unitPrice = Convert.ToDecimal(NewUnitPrice.Text);
 e.InputParameters["unitPrice"] = unitPrice;

 short? unitsInStock = null;
 if (!string.IsNullOrEmpty(NewUnitsInStock.Text))
 unitsInStock = Convert.ToInt16(NewUnitsInStock.Text);
 e.InputParameters["unitsInStock"] = unitsInStock;

 short? unitsOnOrder = null;
 if (!string.IsNullOrEmpty(NewUnitsOnOrder.Text))
 unitsOnOrder = Convert.ToInt16(NewUnitsOnOrder.Text);
 e.InputParameters["unitsOnOrder"] = unitsOnOrder;

 short? reorderLevel = null;
 if (!string.IsNullOrEmpty(NewReorderLevel.Text))
 reorderLevel = Convert.ToInt16(NewReorderLevel.Text);
 e.InputParameters["reorderLevel"] = reorderLevel;
 
 e.InputParameters["discontinued"] = NewDiscontinued.Checked;
}

添加完Inserting事件處理器后,我們就可以通過(guò)GridView控件的頁(yè)腳行添加記錄了。開(kāi)始吧,嘗試添加幾個(gè)產(chǎn)品。

優(yōu)化并自定義Add操作

  一般來(lái)說(shuō),點(diǎn)擊Add按鈕后,就將為數(shù)據(jù)庫(kù)添加一個(gè)新記錄。但是沒(méi)有任何直觀的提示反映成功地添加了記錄。的確,應(yīng)該用一個(gè)Label Web控件或客戶(hù)端的消息框提示用戶(hù)已經(jīng)成功地添加了產(chǎn)品,我把它作為一個(gè)練習(xí)留給讀者。

  本文使用的GridView控件沒(méi)有對(duì)所顯示的產(chǎn)品進(jìn)行任何排序,也未允許最終用戶(hù)對(duì)數(shù)據(jù)排序。因此,產(chǎn)品依它們?cè)跀?shù)據(jù)庫(kù)中的次序排序——依主鍵值順序。由于每條新添加的記錄的ProductID值比上一條的值大,所以,當(dāng)添加新記錄時(shí),它就自然地排到最后一位了。因此,當(dāng)添加新記錄時(shí),你希望自動(dòng)地轉(zhuǎn)到GridView控件的最后一頁(yè)。怎么才能辦到呢?在RowCommand事件處理器里,調(diào)用ProductsDataSource.Insert()方法后,緊接著添加如下一行代碼,它說(shuō)明當(dāng)數(shù)據(jù)綁定到GridView后將轉(zhuǎn)到最后一頁(yè):

// Indicate that the user needs to be sent to the last page
SendUserToLastPage = true;

  其中SendUserToLastPage是頁(yè)面層(page-level)的布爾變量,其初始值為false。在GridView控件的DataBound事件處理器中,如果SendUserToLastPage為false(譯注:應(yīng)該是true),PageIndex屬性將使用戶(hù)轉(zhuǎn)到最后一頁(yè)。

protected void Products_DataBound(object sender, EventArgs e)
{
 // Send user to last page of data, if needed
 if (SendUserToLastPage)
 Products.PageIndex = Products.PageCount - 1;
}

  為什么我們要在DataBound事件處理器(而不是在RowCommand事件處理器)里設(shè)置PageIndex屬性呢?如果在RowCommand里設(shè)置PageIndex屬性的話,它返回的是在添加新記錄之前的PageIndex值。在大多數(shù)情況下,這樣做是沒(méi)有問(wèn)題的,但是,如果新添加的記錄剛好落到新的一頁(yè)(譯注:比如原本有80個(gè)產(chǎn)品,分為8頁(yè)顯示,此時(shí)末頁(yè)的PageIndex為7,當(dāng)添加第81條記錄時(shí),新添加的產(chǎn)品變成第9頁(yè)第1條記錄了,此時(shí)末頁(yè)的PageIndex為8,而不是添加產(chǎn)品前的7),而我們使用RowCommand里設(shè)置的PageIndex值話,頁(yè)面將跳往倒數(shù)第2頁(yè),而不是我們期望的末頁(yè)。而DataBound事件是在添加產(chǎn)品且重新綁定以后才發(fā)生,我們?cè)贒ataBound事件處理器里設(shè)置的PageIndex值才是真正的末頁(yè)的PageIndex值。

  最后,本文用到的GridView看起來(lái)相當(dāng)寬,因?yàn)樘砑赢a(chǎn)品信息要用到很多列。因此,最好將它設(shè)置為豎向排列。另外我們可以減少輸入列來(lái)縮小整體寬度,也許我們添加新產(chǎn)品時(shí)用不到UnitsOnOrder、UnitsInStock、ReorderLevel這幾項(xiàng),那么在GridView里將其移除即可。

刪除UnitsOnOrder、UnitsInStock、ReorderLevel列后需要做調(diào)整,有2種方法:

1.仍然使用AddProduct方法,不過(guò)其需要傳入U(xiǎn)nitsOnOrder、UnitsInStock、ReorderLevel列的值。我們可以在Inserting事件處理器中,對(duì)上述3列使用“硬編碼”值或默認(rèn)值。
2.在ProductsBLL類(lèi)里對(duì)AddProduct方法重載,使其不需要傳入U(xiǎn)nitsOnOrder、UnitsInStock、ReorderLevel列的值。然后,在ASP.NET page頁(yè)面設(shè)置ObjectDataSource使用重載的AddProduct方法。

以上2種方法都能奏效。在以前的教程里我們使用的是后者,對(duì)ProductsBLL類(lèi)的UpdateProduct方法多次重載。

總結(jié):

  DetailsView和FormView控件擁有內(nèi)置的inserting插入數(shù)據(jù)功能,而GridView沒(méi)有。不過(guò)我們可以使用GridView控件的頁(yè)腳行來(lái)達(dá)到此目的。要顯示頁(yè)腳行只需要設(shè)置ShowFooter屬性為true。我們可以這樣對(duì)頁(yè)腳行進(jìn)行用戶(hù)定制:將每一列轉(zhuǎn)換成TemplateField,并在其FooterTemplate模板定制插入界面。正如我們?cè)诒菊驴吹降哪菢樱現(xiàn)ooterTemplate 模板可以包含Buttons,TextBoxes, DropDownLists,CheckBoxes, data source controls,validation controls等控件,除此以外,為了便于用戶(hù)輸入,Add按鈕, LinkButton或ImageButton等也是必需的。

  當(dāng)點(diǎn)擊Add按鈕后,將調(diào)用ObjectDataSource控件的Insert()方法,進(jìn)而使用其映射的插入數(shù)據(jù)方法(具體到本文,即為ProductsBLL類(lèi)的AddProduct方法),在調(diào)用具體的插入數(shù)據(jù)方法前,我們需要將插入界面里鍵入的數(shù)據(jù)傳遞ObjectDataSource控件的InsertParameters集合。要達(dá)到該目的,我們應(yīng)該在ObjectDataSource控件的Inserting事件處理器里,編程訪問(wèn)插入界面的Web控件。

  本教程探討了優(yōu)化GridView外觀的技巧。接下來(lái)的一系列教程,我們看如何使用2進(jìn)制數(shù)據(jù)——比如images, PDFs, Word documents等等,當(dāng)然還有data Web控件。

  祝編程快樂(lè)!

作者簡(jiǎn)介

  本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書(shū),是4GuysFromRolla.com的創(chuàng)始人,自1998年以來(lái)一直應(yīng)用 微軟Web技術(shù)。大家可以點(diǎn)擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程》,希望對(duì)大家的學(xué)習(xí)ASP.NET有所幫助。

您可能感興趣的文章:
  • 在ASP.NET 2.0中操作數(shù)據(jù)之十五:在GridView的頁(yè)腳中顯示統(tǒng)計(jì)信息
  • 在ASP.NET 2.0中操作數(shù)據(jù)之三:創(chuàng)建母版頁(yè)和站點(diǎn)導(dǎo)航
  • asp.net母版頁(yè)如何使用
  • ASP.NET母版頁(yè)基礎(chǔ)知識(shí)介紹
  • ASP.NET中母版頁(yè)和shtml實(shí)例入門(mén)
  • ASP.Net巧用窗體母版頁(yè)實(shí)例
  • asp.net使用母版頁(yè)中使用ajax腳本取數(shù)據(jù)
  • ASP.NET下母版頁(yè)和內(nèi)容頁(yè)中的事件發(fā)生順序整理
  • ASP.NET 2.0 中的創(chuàng)建母版頁(yè)
  • asp.net利用母版制作頁(yè)腳效果

標(biāo)簽:甘肅 海西 慶陽(yáng) 中衛(wèi) 清遠(yuǎn) 臨夏 聊城 巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在ASP.NET 2.0中操作數(shù)據(jù)之五十一:從GridView的頁(yè)腳插入新記錄》,本文關(guān)鍵詞  在,ASP.NET,2.0,中,操作,數(shù)據(jù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。

  • 相關(guān)文章
  • 下面列出與本文章《在ASP.NET 2.0中操作數(shù)據(jù)之五十一:從GridView的頁(yè)腳插入新記錄》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于在ASP.NET 2.0中操作數(shù)據(jù)之五十一:從GridView的頁(yè)腳插入新記錄的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    加勒比成人在线| 久久综合九色| 色综合激情五月| 99久久无色码| 手机免费看av| 成人午夜私人影院| 欧美精品18videosex性欧美| 一级做a爱视频| 国产乱码精品一区二区三区av| 亚洲人成绝费网站色www| 色综合电影网| 色老头在线视频| 欧美日韩激情一区二区三区| 国产男女激情视频| 欧美精品一区三区| 午夜啪啪小视频| 人人超碰91尤物精品国产| 在线精品播放av| 黄色片子免费看| 国产一区二区在线免费观看| 欧美极品少妇xxxxⅹ免费视频| 欧美双性人妖o0| 日韩大片一区二区| 乱老熟女一区二区三区| 亚洲亚洲精品在线观看| 亚洲a成v人在线观看| 91精品国产乱码在线观看| 欧美图片一区二区三区| 日韩国产一区三区| 国产精品第157页| 日韩av午夜在线观看| 欧美第一黄色网| 91小视频在线播放| 国产一区二区在线观看免费| 亚洲成人aaa| 天天插天天操天天射| 国产精品一色哟哟哟| 国产精品海角社区在线观看| 欧美成人777| 精品美女国产在线| 国产爆乳无码一区二区麻豆| 欧美亚洲精品在线观看| 久久精品91久久久久久再现| 成人激情五月天| 一本在线高清不卡dvd| 日本xxxxxxxxxx75| 久久精品理论片| 国产精品视频久久久| 中文字幕在线字幕中文| 日韩欧美一卡二卡| 视频二区在线播放| 国产精品麻豆99久久久久久| 欧美日韩国产精品一卡| 国产女人18毛片水真多| 亚洲男子天堂网| 韩国三级在线播放| 国产欧美日韩在线| 亚洲欧美精品| 香蕉视频网站在线| 国产成人一区二区三区小说 | 精品久久久久久亚洲综合网| 欧美久久久久久久久久久| 中文av一区特黄| 麻豆视频传媒入口| 青青青伊人色综合久久| 久久久午夜视频| 日本aⅴ在线观看| 欧美一区二区三区喷汁尤物| 国产高清av片| 亚洲视频一区二区免费在线观看| 日韩精品手机在线观看| 久久久一区二区| 中文字幕一区二区三区四区五区 | 久久久国产一区二区三区四区小说| 日韩免费一区二区三区| 免费观看久久久4p| 91久色国产| 青娱乐精品在线视频| 国产精品二区在线| jizz中国少妇| 国产精品一二三视频| 天天射天天干天天| 午夜精品久久17c| 97成人在线观看| 2021国产精品视频| 国产理论视频在线观看| 欧美插天视频在线播放| 黄色污污视频软件| 久久在线视频在线| 亚洲熟妇av乱码在线观看| 日韩av手机在线| 在线视频欧美亚洲| 国产伦精品一区二区三区精品视频| 天天干,夜夜爽| 成人国产亚洲精品a区天堂华泰 | 黄色成人在线看| 国产精品网站一区| 日本美女高潮视频| 日韩欧美亚洲范冰冰与中字| 丁香婷婷综合激情| 久久久噜噜噜久久中文字幕色伊伊 | 狠狠躁18三区二区一区| 亚洲少妇一区二区三区| 欧美v日韩v国产v| 久久黄色小视频| 91福利视频网| 色婷婷综合久久久久中文| 天堂网中文字幕| 中文日韩在线观看| 国产xxxx振车| 91精品久久久久久久| 国产无遮挡又黄又爽在线观看| 精品处破学生在线二十三| 羞羞在线观看视频| 中文字幕精品视频| 人人妻人人爽人人澡人人精品| 欧美激情一区二区久久久| 国产男男gay体育生白袜| 国产精品午夜国产小视频| 国产在线一区观看| 自拍偷拍99| 在线免费精品视频| 性色av无码久久一区二区三区| 久久精彩免费视频| 精品人妻少妇嫩草av无码专区| www 成人av com| 久久精品综合网| 肉色超薄丝袜脚交| 亚洲精品资源在线| 一级片视频网站| 黄色99视频| 亚洲人亚洲人成电影网站色| 人妻激情偷乱频一区二区三区| 日韩电影网在线| 日韩欧美成人一区二区三区| 91麻豆桃色免费看| 国产婷婷色一区二区三区四区| 婷婷中文字幕在线观看| 日韩精品在线私人| 99精品免费观看| 在线观看一区欧美| 欧美自拍偷拍午夜视频| 日本一二三区不卡| 国产欧美一区二区三区四区| 91小视频在线| 男男一级淫片免费播放| 欧美成人免费播放| 国产一区 二区 三区一级| 亚洲图色中文字幕| 日韩国产精品亚洲а∨天堂免| 国产精品51麻豆cm传媒| 久久爱av电影| 亚洲国产精品自拍| 中文字幕在线有码| 91最新国产视频| 亚洲免费观看高清完整版在线| 色欲AV无码精品一区二区久久| 5566日本婷婷色中文字幕97| 成人黄色777网| 国产精品久久久久久在线观看| 九九热这里只有精品免费看| 极品少妇xxxx偷拍精品少妇| 一区二区三区视频网| 日韩在线视频网| 国产在线精品一区二区三区不卡| 日韩av在线中文| 久久97精品久久久久久久不卡| 国产精品一区一区| 伊人av在线播放| 韩国三级日本三级少妇99| 99久久99久久精品免费看蜜桃| 亚洲av午夜精品一区二区三区| 欧美极品少妇xxxxⅹ喷水| av在线一区二区三区| 久久av无码精品人妻系列试探| 国产精品入口免费视| 亚洲三级电影网站| 日本学生初尝黑人巨免费视频| 精品日本一区二区| 在线电影国产精品| 日韩有码第一页| 色一情一区二区三区| 欧美精品久久久久久久久久| 国产视频一区在线观看| 丝袜 亚洲 另类 欧美 重口| 狠狠久久综合婷婷不卡| 欧美日韩免费在线视频| 黄色一级大片在线免费观看| 国产欧美精品一区二区三区| 色婷婷av一区二区三区大白胸| 亚洲av无码精品一区二区| 日本a级片在线观看| 日韩黄色高清视频| 久久精品99国产国产精| www亚洲成人| 97激碰免费视频| 最新久久zyz资源站| 久久久久99精品| 黄色一级片网址| 丝袜美腿精品国产二区| 丁香婷婷综合五月| 国产精品成人网站| 亚洲国产精品女人| 久久久久久91| 岛国精品视频在线播放| 久久精品二区三区| 99久久99久久精品免费看小说. | 欧美性色19p| 老司机精品导航| jizz中文字幕| 亚洲综合首页| 久热精品在线视频| 亚洲午夜久久久久久久久久久| 91禁在线观看| 国产特黄级aaaaa片免| 91文字幕巨乱亚洲香蕉| 7777精品伊人久久久大香线蕉最新版 | 精品久久久久久久久久久久久久久久久久| 亚洲欧洲一二三| 日韩中文字幕精品视频| 国产精品第13页| 久久国产精品露脸对白| 波多野结衣先锋影音| 国产精选一区二区| 精品久久在线观看| 自慰无码一区二区三区| 久久亚洲国产成人精品无码区| 久久精品亚洲94久久精品| 亚洲视频在线一区| 欧美一级一区二区三区| 中字幕一区二区三区乱码| 老司机午夜网站| 91av在线看| 欧美午夜在线观看| 亚洲高清三级视频| 精品人妻一区二区三区蜜桃 | 茄子视频成人在线观看| 亚洲第一精品夜夜躁人人爽| 国产美女视频91| 国产真实乱在线更新| 少妇无码av无码专区在线观看| 日韩欧美国产系列| 99久久婷婷国产综合精品| 国产日韩精品视频一区| 亚洲欧洲一区二区在线播放| 国产精品久久久久精k8| 亚洲精品高清在线观看| 欧美日韩一区免费| 91麻豆精品91久久久久同性| 亚洲韩国日本中文字幕| 欧美高清视频在线播放| 午夜精品久久久久久99热软件| 国产欧美在线视频| 就去色蜜桃综合| 91嫩草国产丨精品入口麻豆| 国产视频一区二区三区在线播放| 被黑人猛躁10次高潮视频| 成人免费无码大片a毛片| 人人人妻人人澡人人爽欧美一区| 天天干天天操天天拍| 99久久婷婷国产综合| 免费一级片在线观看| 九九九国产视频| 日韩免费视频网站| 一级黄色大片视频| 中文天堂在线播放| 亚洲老妇色熟女老太| 日韩一区二区三区不卡| 懂色av中文字幕一区二区三区| 粉嫩高潮美女一区二区三区| 国产一区二区女| 久久视频一区二区| 国产精品主播直播| 久久99热这里只有精品| 日本波多野结衣在线| 狠狠色丁香婷婷综合久久片| 亚洲精品视频免费看| 91精品国产综合久久婷婷香蕉| www.亚洲一区| av一区二区三区四区电影| 亚洲一区二区三区四区视频| 欧美怡红院视频一区二区三区| 久久国产精品久久久久久| 在线观看成人黄色| 在线播放日韩av| 日韩精品电影网| 欧美精品一区二区高清在线观看| 精品99一区二区| 天天综合色天天| 成人avav影音| 人妻一区二区三区| 日本少妇吞精囗交| 91久久国产综合| 影音先锋男人在线| 91玉足脚交白嫩脚丫| 一级特黄性色生活片| 欧洲美女和动交zoz0z| 在线一区亚洲| 一区二区欧美日韩| 日韩精品欧美在线| 麻豆传媒一区| 亚洲一区三区| 一区二区在线不卡| 日韩一二在线观看| 亚洲最大成人网色| 欧美亚洲在线视频| 日韩av手机在线观看| 伊人精品在线观看| 亚洲香蕉成人av网站在线观看| 亚洲丝袜一区在线| 91.com在线观看| 色综合一区二区| 亚洲第一久久影院| 富二代精品短视频| 精品av在线播放| **欧美大码日韩| 国产精品每日更新| 久久先锋影音av鲁色资源| 国产盗摄一区二区三区| 亚洲欧美另类日韩| 一区二区三区午夜| 波多野结衣影片| 成 人 黄 色 片 在线播放| 久久国产直播| 国产精品一区二区无线| 91蝌蚪国产九色| 亚洲三级小视频| 色欧美日韩亚洲| 亚洲第一免费网站| 国产亚洲欧洲高清| 欧美精品免费在线| 97国产真实伦对白精彩视频8| 久久久久久久久国产| 成人免费观看a| 亚洲va久久久噜噜噜久久天堂| 亚洲一区二区免费视频软件合集| jizz欧美性20| 人成网站在线观看| 一本色道久久综合亚洲91| 国产精品男人爽免费视频1| 黄色免费高清视频| 在线观看天堂av| 亚洲精品久久久久久久久久| 亚洲精品美腿丝袜| 91av福利视频| 欧美三级网色| 99福利在线观看| 日韩av黄色片| 精品国产一级片| 欧美激情一区二区在线| 日韩一区二区三区电影在线观看 | 免费在线a视频| 宅男噜噜噜66国产免费观看| 精品无码人妻一区二区免费蜜桃| 国产www在线| 国产精品一品视频| 亚洲成成品网站| 免费看成人午夜电影| 国产黄色三级网站| 国产情侣呻吟对白高潮| 久久爱www久久做| 国产亚洲欧洲997久久综合 | 国产精品一区二区三区免费视频 | 日韩电影一区二区三区| 成a人片亚洲日本久久| 国产亚洲午夜高清国产拍精品| 精品久久久久久久久久久久| 日韩一区二区三区免费看| 日韩电影大片中文字幕| 蜜月aⅴ免费一区二区三区| 国产精品久久久久久久久久新婚| 精品欧美日韩在线| 喜爱夜蒲2在线| 女王人厕视频2ⅴk| 免费在线一区二区三区| 国产又粗又猛又爽| 国产精品综合网| |精品福利一区二区三区| 日韩三级视频中文字幕| 久久久国产精彩视频美女艺术照福利| 国产日产亚洲精品| 日本在线高清视频一区| 久久久国产欧美| 久久久久久久毛片| 波多野结衣高清视频| 懂色av一区二区三区免费观看| 国产精品不卡在线| 精品国产亚洲一区二区三区在线观看| 欧美激情一区二区三区高清视频| 久久久福利视频| 日本久久精品一区二区| 朝桐光av在线| 人人爽香蕉精品| 国产精品久久久久9999吃药| 精品国产污污免费网站入口 | 成人毛片视频网站| 国产精品老牛影院在线观看| 亚洲男人天堂网| 91精品国产一区| 欧美在线观看视频免费| 免费啪视频在线观看| 日韩乱码在线观看| 久久精品国产精品青草| 午夜视频在线观看一区二区| 国产丝袜一区二区| 国产色视频一区| cao在线观看| 国产视频123区| 殴美一级特黄aaaaaa| 欧美高清在线一区二区|