1. 程式人生 > >網上購物系統(Task007)——自定義DateList控制元件分頁顯示商品資訊

網上購物系統(Task007)——自定義DateList控制元件分頁顯示商品資訊

原始碼:13033480群共享

一、資料集Model新增商品資訊類ItemInfo.cs。

using System; namespace WestGarden.Model { public class ItemInfo { private int itemid; private string categoryid; private string name; private decimal price; private string image; private string categoryname; public ItemInfo() { } public ItemInfo(int itemid, string categoryid, string name, decimal price, string image, string categoryname) { this.itemid = itemid; this.categoryid = categoryid; this.name = name; this.price = price; this.image = image; this.categoryname = categoryname; } public int ItemId { get { return itemid; } set { itemid = value; } } public string CategoryId { get { return categoryid; } set { categoryid = value; } } public string Name { get { return name; } set { name = value; } } public decimal Price { get { return price; } set { price = value; } } public string Image { get { return image; } set { image = value; } } public string CategoryName { get { return categoryname; } set { categoryname = value; } } } }

二、資料訪問層DAL

中新增類Item.cs,並新增函式GetItemsByCategory()

using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using WestGarden.Model; using WestGarden.DBUtility; namespace WestGarden.DAL { public class Item { private const string SQL_SELECT_ITEMS_BY_CATEGORY = "SELECT Item.ItemId,Item.CategoryId,Item.Name,Item.Price,Item.Image,Category.Name FROM Item INNER JOIN Category ON Item.CategoryId=Category.CategoryId WHERE Item.CategoryId = @CategoryId"; private const string PARM_CATEGORY_ID = "@CategoryId"; public IList<ItemInfo> GetItemsByCategory(string CagegoryId) { IList<ItemInfo> itemsByCategory = new List<ItemInfo>(); SqlParameter parm = new SqlParameter(PARM_CATEGORY_ID, SqlDbType.VarChar, 20); parm.Value = CagegoryId; //Execute the query against the database using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_ITEMS_BY_CATEGORY, parm)) { // Scroll through the results while (rdr.Read()) { ItemInfo item = new ItemInfo(rdr.GetInt32(0), rdr.GetString(1), rdr.GetString(2), rdr.GetDecimal(3), rdr.GetString(4), rdr.GetString(5)); itemsByCategory.Add(item); } } return itemsByCategory; } } }
三、DataList
顯示商品資訊
1、 Item.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Items1.aspx.cs" Inherits="WestGarden.Web.Items1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>肯德基訂餐系統——西園工作室</title> </head> <body> <form id="form1" runat="server"> <div> <asp:DataList ID="dlstItems" runat="server"> <ItemTemplate> <table cellpadding="0" cellspacing="0"> <tr> <td> <asp:Image ID="imgItem" runat="server" AlternateText='<%# Eval("Name") %>' Height="120" ImageUrl='<%# Eval("Image") %>' Width="120" /> </td> </tr> <tr> <td> <%# Eval("Name") %> </td> </tr> <tr> <td> <%# Eval("Price") %> </td> </tr> </table> </ItemTemplate> </asp:DataList></div> </form> </body> </html>

2、Item.aspx.cx

using WestGarden.DAL; namespace WestGarden.Web { public partial class Items1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string categoryKey = Request.QueryString["categoryId"]; Item item =new Item(); dlstItems.DataSource = item.GetItemsByCategory(categoryKey); dlstItems.DataBind(); } } }

四、自定義DataList分頁顯示商品資訊

1、自定義控制元件CustomList.cs,新增分頁功能。

using System; using System.Collections; using System.Collections.Specialized; using System.Text; using System.Text.RegularExpressions; using System.Web.UI; using System.Web.UI.WebControls; namespace WestGarden.Web { public class CustomList : DataList { //Static constants protected const string HTML1 = "<table cellpadding=0 cellspacing=0><tr><td colspan=2>"; protected const string HTML2 = "</td></tr><tr><td class=paging align=left>"; protected const string HTML3 = "</td><td align=right class=paging>"; protected const string HTML4 = "</td></tr></table>"; private static readonly Regex RX = new Regex(@"^&page=\d+", RegexOptions.Compiled); private const string LINK_PREV = "<a href=?page={0}><上一頁</a>"; private const string LINK_MORE = "<a href=?page={0}>下一頁></a>"; private const string KEY_PAGE = "page"; private const string COMMA = "?"; private const string AMP = "&"; protected string emptyText; private IList dataSource; private int pageSize = 10; private int currentPageIndex; private int itemCount; override public object DataSource { set { //This try catch block is to avoid issues with the VS.NET designer //The designer will try and bind a datasource which does not derive from ILIST try { dataSource = (IList)value; ItemCount = dataSource.Count; } catch { dataSource = null; ItemCount = 0; } } } public int PageSize { get { return pageSize; } set { pageSize = value; } } protected int PageCount { get { return (ItemCount - 1) / pageSize; } } virtual protected int ItemCount { get { return itemCount; } set { itemCount = value; } } virtual public int CurrentPageIndex { get { return currentPageIndex; } set { currentPageIndex = value; } } public string EmptyText { set { emptyText = value; } } public void SetPage(int index) { OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index)); } override protected void OnLoad(EventArgs e) { if (Visible) { string page = Context.Request[KEY_PAGE]; int index = (page != null) ? int.Parse(page) : 0; SetPage(index); } } /// <summary> /// Overriden method to control how the page is rendered /// </summary> /// <param name="writer"></param> override protected void Render(HtmlTextWriter writer) { //Check there is some data attached if (ItemCount == 0) { writer.Write(emptyText); return; } //Mask the query string query = Context.Request.Url.Query.Replace(COMMA, AMP); query = RX.Replace(query, string.Empty); // Write out the first part of the control, the table header writer.Write(HTML1); // Call the inherited method base.Render(writer); // Write out a table row closure writer.Write(HTML2); //Determin whether next and previous buttons are required //Previous button? if (currentPageIndex > 0) writer.Write(string.Format(LINK_PREV, (currentPageIndex - 1) + query)); //Close the table data tag writer.Write(HTML3); //Next button? if (currentPageIndex < PageCount) writer.Write(string.Format(LINK_MORE, (currentPageIndex + 1) + query)); //Close the table writer.Write(HTML4); } override protected void OnDataBinding(EventArgs e) { //Work out which items we want to render to the page int start = CurrentPageIndex * pageSize; int size = Math.Min(pageSize, ItemCount - start); IList page = new ArrayList(); //Add the relevant items from the datasource for (int i = 0; i < size; i++) page.Add(dataSource[start + i]); //set the base objects datasource base.DataSource = page; base.OnDataBinding(e); } public event DataGridPageChangedEventHandler PageIndexChanged; virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e) { if (PageIndexChanged != null) PageIndexChanged(this, e); } } }

2、使用者控制元件

1ItemssControl.ascx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Items1.aspx.cs" Inherits="WestGarden.Web.Items1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>肯德基訂餐系統——西園工作室</title> </head> <body> <form id="form1" runat="server"> <div> <asp:DataList ID="dlstItems" runat="server"> <ItemTemplate> <table cellpadding="0" cellspacing="0"> <tr> <td> <asp:Image ID="imgItem" runat="server" AlternateText='<%# Eval("Name") %>' Height="120" ImageUrl='<%# Eval("Image") %>' Width="120" /> </td> </tr> <tr> <td> <%# Eval("Name") %> </td> </tr> <tr> <td> <%# Eval("Price") %> </td> </tr> </table> </ItemTemplate> </asp:DataList></div> </form> </body> </html>

2ItemssControl.ascx.cs

using System; using System.Web; using System.Web.UI.WebControls; using WestGarden.DAL; namespace WestGarden.Web { public partial class ItemsControl : System.Web.UI.UserControl { /// <summary> /// Rebind control /// </summary> protected void PageChanged(object sender, DataGridPageChangedEventArgs e) { //reset index dlstItems.CurrentPageIndex = e.NewPageIndex; //get category id string categoryKey = Request.QueryString["categoryId"]; //bind data Item item = new Item(); dlstItems.DataSource = item.GetItemsByCategory(categoryKey); dlstItems.DataBind(); } } }

相關推薦

網上購物系統Task007——定義DateList控制元件顯示商品資訊

原始碼:13033480群共享 一、資料集Model新增商品資訊類ItemInfo.cs。 using System; namespace WestGarden.Model { public class ItemInfo { privat

帶checkbox的ListView實現——定義Checkable控制元件的實現方法

前言:前一篇文章給大家展示了傳統的Listview的寫法,但有的時候我們並不想在DataHolder類中加一個標識是否選中的checked的成員變數,因為在專案開發中,大部分的ListItemLayout佈局都是大家共用的,有些人根本不需要checkbox控制元件,所以會在初

iOS---tabletableView的單選系統對勾 定義的單選定義圖片

轉自: https://blog.csdn.net/qq_36747738/article/details/60867635轉自: https://blog.csdn.net/qq_29284809/article/details/50057989//選擇轉賬使用者對勾-(v

AngularJs學習筆記4——定義指令

ref 告訴 ack 生命周期 .com bsp ctrl 參數變量 ng- 對指令的第一印象:它是一個自定義標簽! 先來看一個簡單的指令: <!doctype html> <html ng-app="myApp"> <head>

微信公眾平臺開發教程定義菜單

打開鏈接 delete toolbar 推送 優化 pcl reader 接口查詢 robot 應大家強烈要求,將自定義菜單功能課程提前。 一、概述: 如果只有輸入框,可能太簡單,感覺像命令行。自定義菜單,給我們提供了很大的靈活性,更符合用戶的操作習慣。在一個小小的微信對話

JS基礎定義函數

調用函數 pre 基礎 clas 自定義 語句 ... 全局 blog 作用:是為了讓重復使用的語句,方便進行調用。 定義格式: function 自定義函數名 (參數1, 參數2,...) { 執行的語句 } 函數的封裝:把語句放到函數中去的過程。 參數:通過

WPF定義控件定義控件

自己 setvalue prop 一個 自己的 支持 property get element 在實際工作中,WPF提供的控件並不能完全滿足不同的設計需求。這時,需要我們設計自定義控件。 這裏LZ總結一些自己的思路,特性如下: Coupling UITemplate Be

Django 表單中下- 定義鉤子進行數據驗證

form hook 在前面的例子裏面 http://beanxyz.blog.51cto.com/5570417/1963702,已經演示了form可以自動地對正則進行合法的判斷,如果不合法,會直接顯示錯誤信息。但是這個功能並不完善,比如說一個數據可能正則判斷合法了,但是不符合唯一性的判斷,那麽怎麽處

4定義數據結構初探

lang 結構 十分 類型 是把 數據 庫類 結束 基本 從最基本的層面理解,數據結構是把一組相關的數據元素組織起來然後使用她們的策略和方法。 C++運行用戶以類的形式自定義數據類型,而庫類型是語言自身定義的,類在C++中十分重要!盡管sales_item很簡單,但要想給出

定義Realm

ssi 定義 try time public getname tid vax getc 引入依賴 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/

weex 項目開發定義 過濾函數 和 混合 及 定義 Header 組件

定義 blog weex top ber slice ear notice earch 1.自定義 過濾函數 src / filters / index.js /** * 自定義 過濾函數 */ export function host (url) { if (

EL表達式定義 EL 表達式

abd sun title contain tld sta 參數 func lns 自定義EL函數(靜態方法): 編寫步驟: 1.編寫一個Java類,提供一個靜態方法 import java.util.List; public class GetLength {

Spring 源碼分析--定義標簽的使用

div protected 不同 space xsd文件 不同的 handle body img 在之前的代碼分析中,Spring標簽的解析分為 默認標簽和自定義標簽兩種,前一篇文章分析了Spring中對默認標簽的解析過程。 本文將分析Spring中自定義標

12定義數據流實戰Docker事件推送的REST API——響應式Spring的道法術器

Spring WebFlux 響應式編程 本系列文章索引《響應式Spring的道法術器》前情提要 Reactor 3快速上手 | Spring WebFlux快速上手 | 響應式流規範本文 測試源碼 | 實戰源碼 2.2 自定義數據流 這一小節介紹如何通過定義相應的事件(onNext、onError

MySQL數據庫高級——定義函數

MySQL 自定義 函數 MySQL數據庫高級(二)——自定義函數 一、自定義函數簡介 自定義函數 (user-defined function UDF)是一種對MySQL擴展的途徑,其用法和內置函數相同。自定義函數的兩個必要條件:A、參數B、返回值(必須有)。函數可以返回任意類型的值。 二、自定

大數據入門第二十二天——spark定義區、排序與查找

get buffer arr clas ron arm scala mut all 一、自定義分區   1.概述     默認的是Hash的分區策略,這點和Hadoop是類似的,具體的分區介紹,參見:https://blog.csdn.net/high2011/arti

Flask系列定義Form組件

pri 擴展 append BE sam cep default .get pos 一、wtforms源碼流程 1、實例化流程分析 # 源碼流程 1. 執行type的 __call__ 方法,讀取字段到靜態字段 cls._unbound_fields 中; me

mysql的學習-定義函數和流程控制

returns spa 會員 返回 類型 mysq -- create decimal DELIMITER // (設置結束符 其實我也不太明白為啥要這樣 記住就行把) CREATE FUNCTION ym_date(mydate DATE) (創建函數

Angularjs進階筆記2-定義指令中的數據綁定

粘貼 文章 發送 制作 取值 不同的 過多 簡單 也會 Angularjs進階筆記(2)-自定義指令中的數據綁定 有關自定義指令的scope參數,網上很多文章都在講這3種綁定方式實現的效果是什麽,但幾乎沒有人講到底怎麽使用,本篇希望聊聊到底怎麽用這個話題。 一. 自定義

使用雲監控實現GPU雲服務器的GPU監控和報警 - 定義監控

調度 相關數 圖片 size 語言 rontab end ces format 摘要: 本文將介紹如何利用阿裏雲雲監控服務提供的自定義監控實現GPU雲服務器的GPU監控和報警的可視化,從而達到對GPU使用情況實時掌握的目的。 1 背景NVIDIA提供了nvidia-smi