34-跨頁(yè)面的主從報(bào)表.doc_第1頁(yè)
34-跨頁(yè)面的主從報(bào)表.doc_第2頁(yè)
34-跨頁(yè)面的主從報(bào)表.doc_第3頁(yè)
34-跨頁(yè)面的主從報(bào)表.doc_第4頁(yè)
34-跨頁(yè)面的主從報(bào)表.doc_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

在前面一章里我們學(xué)習(xí)了如何在一個(gè)頁(yè)里顯示主/從信息.另外一種經(jīng)常使用的模式就是將主從信息用兩個(gè)頁(yè)分別顯示.在前面的跨頁(yè)面的主/從報(bào)表 我們通過(guò)GridView顯示所有的supplier來(lái)使用這個(gè)模式.GridView里包含一個(gè)HyperLinkField,鏈接到另外一個(gè)頁(yè),并將SupplierID通過(guò)querystring傳過(guò)去.第二個(gè)頁(yè)使用GridView列出了選中的supplier提供的product.這樣的兩頁(yè)主/從表也可以用DataList和Repeater來(lái)實(shí)現(xiàn).唯一的區(qū)別是DataList和Repeater都不提供HyperLinkField.所以我們需要添加一個(gè)HyperLink控件或者在ItemTemplate里使用HTML .HyperLink的NavigateUrl屬性和的href屬性可以通過(guò)聲明或者編程來(lái)自定義.本章我們將探討使用Repeater列出categories.每個(gè)list item都包含了category的name和description.通過(guò)name可以直接鏈接到第二個(gè)頁(yè)面.在第二頁(yè)里用DataList顯示選中的categroy提供的proudct.第一步: 列出Categories 所有創(chuàng)建主從表的第一步都是顯示主記錄.因此,我們首先在主頁(yè)里顯示categories.打開(kāi)DataListRepeaterFiltering文件夾里的CategoryListMaster.aspx頁(yè),添加一個(gè)Repeater,然后通過(guò)智能標(biāo)簽添加一個(gè)ObjectDataSource.使用CategriesBLL類的GetCategories方法配置它.見(jiàn)圖1.圖 1:使用CategoriesBLL類的GetCategories方法配置ObjectDataSource 我們先不關(guān)心如何添加link.將Repeater的template配置成顯示每個(gè)category的name和description.見(jiàn)下面的代碼:ASP.NET - 完成了上面的代碼后,在瀏覽器里瀏覽頁(yè)面.如圖2所示.圖 2: 列出所有的 Category 第二步: 將Category Name 轉(zhuǎn)換成鏈到Details Page 的Link 我們現(xiàn)在來(lái)添加一個(gè)link,當(dāng)用戶點(diǎn)擊時(shí),將會(huì)鏈到第二個(gè)頁(yè)(ProductsForCategoryDetails.aspx),在這個(gè)頁(yè)里顯示從信息.這頁(yè)里用DataList顯示選中的category的product.為了判斷是哪個(gè)category的鏈接被點(diǎn)了,我們需要將CategoryID傳到第二頁(yè).最直接的方法是通過(guò)querystring.我們通過(guò)名為CategoryID的querystring字段將這個(gè)傳給ProductsForCategoryDetails.aspx.例如,查看Beverages categroy下的product,CategoryID為1.用戶將訪問(wèn)ProductsForCategoryDetails.aspx?CategoryID=1頁(yè).為了創(chuàng)建hyperlink我們需要添加HyperLink控件或者在ItemTemplate里添加HTML.在每行的hyperlink都相同的情況下,兩種方法都足夠了.對(duì)Repeater來(lái)說(shuō)我更愿意使用.見(jiàn)下面的代碼:ASP.NET a href=ProductsForCategoryDetails.aspx?CategoryID= - 注意CategoryID可以直接通過(guò)href屬性寫(xiě)入.注意引號(hào)和省略號(hào).ASP.NET asp:HyperLink runat=server Text= NavigateUrl= - 注意在綁定語(yǔ)法里靜態(tài)URL ProductsForCategoryDetails.aspx?CategoryID 是如何直接和Eval(CategoryID)的結(jié)果串聯(lián).使用HyperLink控件的一個(gè)好處是如果需要的話可以編程訪問(wèn)Repeater的ItemDataBound event handler.例如你可以將沒(méi)有關(guān)聯(lián)product的categories顯示為文本,而不是link.將那些沒(méi)有關(guān)聯(lián)product的categories的HyperLink的NavigateUrl屬性設(shè)為一個(gè)空的字符串,這樣category name就顯示為一個(gè)text(而不是link).更多的通過(guò)ItemDataBound event handler的編程來(lái)格式化DataList和Repeater內(nèi)容的信息請(qǐng)看格式化DataList和Repeater的數(shù)據(jù).如果你在跟著教程做的話,使用上面兩種方法都可以.當(dāng)瀏覽這頁(yè)時(shí),每個(gè)category name都以link的形式呈現(xiàn),可以鏈接到ProductsForCategoryDetails.aspx頁(yè),并將CategoryID的值傳過(guò)去.見(jiàn)圖3.圖 3: Category Names 現(xiàn)在鏈接到ProductsForCategoryDetails.aspx頁(yè)第三步: 列出選中的Category下的Products 完成CategoryListMaster.aspx頁(yè)后,我們現(xiàn)在來(lái)完成從頁(yè),ProductsForCategoryDetails.aspx.打開(kāi)這個(gè)頁(yè),拖一個(gè)DataList控件進(jìn)來(lái),并將ID設(shè)置為ProductsInCategory.然后在智能標(biāo)簽里選擇添加一個(gè)名為ProductsInCategoryDataSource的ObjectDataSource.并用ProductsBLL類的GetProductsByCategoryID(categoryID)方法配置它.在INSERT,UPDATE,DELETE標(biāo)簽里選擇None.圖 4: 使用ProductsBLL類的GetProductsByCategoryID(categoryID)方法配置ObjectDataSource 由于GetProductsByCategoryID(categoryID)方法接收一個(gè)參數(shù),所以向?qū)?huì)提示我們指定參數(shù)來(lái)源.設(shè)置parameter source為QueryString,QueryStringField為CategoryID.圖 5: 使用Querystring Field 作為Parameter Source象前面教程里看到的那樣,完成數(shù)據(jù)源配置后,Visual Studio會(huì)自動(dòng)創(chuàng)建一個(gè)ItemTemplate列出每個(gè)字段的name和value.我們只顯示name,supplier和price.將DataList的RepeatColumns屬性設(shè)為2.完成這些后你的聲明標(biāo)記看起來(lái)應(yīng)該和下面差不多:ASP.NET Supplied by 現(xiàn)在我們來(lái)看看效果,先瀏覽CategoryListMater.aspx頁(yè).然后在列出的category上點(diǎn)一個(gè)link.這樣就會(huì)跳到ProductsForCategoryDetails.aspx頁(yè),并將CategoryID通過(guò)querystring傳過(guò)去.ProductsInCategoryDataSource ObjectDataSource會(huì)返回指定category的product并將它們顯示在DataList中,每行兩個(gè).圖6是點(diǎn)擊Beverages的截圖.圖 6: 每行兩個(gè)的顯示Beverages 第四步: 在ProductsForCategoryDetails.aspx里顯示 Category 信息當(dāng)用戶在CategoryListMaster.aspx頁(yè)點(diǎn)擊一個(gè)category時(shí),會(huì)跳到ProductsForCategoryDetails.aspx頁(yè)并顯示選中的categry下的product.然而在這個(gè)頁(yè)里并沒(méi)有包含哪個(gè)category被選中了的信息.用戶可能想點(diǎn)Beverages,但是結(jié)果點(diǎn)了Condiments,這時(shí)他沒(méi)辦法知道自己是否點(diǎn)錯(cuò)了.為了剞劂這個(gè)問(wèn)題,我們可以將選中的category信息顯示在ProductsForCategoryDetails.aspx頁(yè)的頂部(name和description).在ProductsForCategoryDetails.aspx的Repeater上添加一個(gè)FormView.然后通過(guò)智能標(biāo)簽添加一個(gè)名為CategoryDataSource的ObjectDataSource,并用CategoriesBLL類的GetCategoryByCategoryID(categoryID)方法配置它.圖 7: 配置CategoryDataSource在第三步增加ProductsInCategoryDataSource ObjectDataSource時(shí),向?qū)崾疚覀優(yōu)镚etCategoryByCategoryID(categoryID)方法指定輸入?yún)?shù).在這里我們使用和前面一樣的配置,將parameter source設(shè)為QueryString,QueryStringField設(shè)為CategoryID(見(jiàn)圖5).完成向?qū)Ш?Visual Studio會(huì)為FormView自動(dòng)創(chuàng)建ItemTemplate,EditItemTemplate和InsertItemTemplate.由于只提供只讀的界面,我們將EditItemTemplate和InsertItemTemplate.當(dāng)然你也可以自定義FormView的ItemTemplate.完成上面的操作偶你的標(biāo)記語(yǔ)言應(yīng)該和下面差不多:ASP.NET asp:Label ID=CategoryNameLabel runat=server Text= / asp:Label ID=DescriptionLabel runat=server Text= / 注意:我們還在FormView上加了一個(gè)HyperLink,它會(huì)將用戶鏈回到category頁(yè)(CategoryListMaster.aspx).圖 8: Category 信息顯示在頁(yè)的頂部第五步: 如果選中的Category下無(wú) Products 則顯示一個(gè)提示信息無(wú)論有沒(méi)有相關(guān)聯(lián)的product,CategoryListMaster.aspx頁(yè)都會(huì)列出所有的category.如果用戶點(diǎn)了一個(gè)無(wú)product的category,由于數(shù)據(jù)源為空,在ProductsForCategoryDetails.aspx頁(yè)里的DataList將不會(huì)顯示.在前面的教程里我們看到了GridView提供了一個(gè)EmptyDataText屬性,可以用來(lái)在數(shù)據(jù)源無(wú)記錄時(shí)定義一個(gè)消息.不幸的是DataList和Repeater都沒(méi)有這個(gè)屬性.為了在category無(wú)product時(shí)提示用戶,我們需要在頁(yè)里加一個(gè)Label控件.在沒(méi)有匹配的product時(shí)將它的Text屬性設(shè)置為要顯示的信息.我們需要根據(jù)DataList有沒(méi)有內(nèi)容來(lái)編程設(shè)置它的Visible屬性.首先在DataList下加一個(gè)Label控件.將它的ID設(shè)為NoProductsMessage,Text設(shè)為T(mén)here are no products for the selected category.然后我們根據(jù)是否有數(shù)據(jù)綁定到ProductsInCategory DataList來(lái)設(shè)置它的Visible屬性.這一步需要在數(shù)據(jù)綁定到DataList之后做.對(duì)GridView,DetailsView和FormView來(lái)說(shuō),我們可以為DataBound事件創(chuàng)建一個(gè)event handler.在數(shù)據(jù)綁定完后激發(fā).然而DataList和Repeater都沒(méi)有DataBound事件.在這個(gè)例子里我們可以在Page_Load事件處理里設(shè)置Label的Visible屬性.由于數(shù)據(jù)綁定到DataList先于Page的Load事件.然而,這種方法在一般情況下不會(huì)起作用,因?yàn)閺腛bjectDataSource來(lái)的數(shù)據(jù)是在頁(yè)面周期之后綁定到DataList.如果顯示的數(shù)據(jù)基于另一個(gè)控件的值,例如,象在使用DropDownList顯示主記錄的主/從表的例子里,數(shù)據(jù)直到Page的生命周期的PreRender后才綁定到控件.一個(gè)在所有情況下都起作用的解決方案是在DataList的ItemDataBound(或ItemCreated)事件處理中設(shè)置Visible為False.在這種情況下我們知道數(shù)據(jù)源里至少有一個(gè)數(shù)據(jù)項(xiàng),因此可以隱藏NoProductsMessage Label.除了這個(gè)event handler外,我們還需要一個(gè)DataList DataBingd的事件處理,來(lái)初始化Label的Visible屬性為T(mén)rue.由于DataBinding時(shí)間在ItemDataBound事件后激發(fā),Label的Visible屬性會(huì)初始化為T(mén)rue.如果有數(shù)據(jù),它會(huì)被設(shè)為False.見(jiàn)下面的代碼:C# protected void ProductsInCategory_DataBinding(object sender, EventArgs e) / Show the Label NoProductsMessage.Visible = true; protected void ProductsInCategory_ItemDataBound(object sender, DataListItemEventArgs e) / If we have a data item, hide the Label if (e.Item.ItemType = ListItemType.Item | e.Item.ItemType = ListItemType.AlternatingItem) NoProductsMessage.Visible = false; 在Northwind數(shù)據(jù)庫(kù)里的category都和一個(gè)或多個(gè)product關(guān)聯(lián).為了測(cè)試上面的功能,我手動(dòng)修改了Northwind數(shù)據(jù)庫(kù),將Produce categ

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論