Phƣơng thức khởi tạo

Một phần của tài liệu CÔNG NGHỆ WEB NÂNG CAO XÂY DỰNG WEBSITES VỚI ASP.NET 2.0 (Trang 28)

Sau khi khai báo đối tƣợng SqlConnection, chúng ta cần khởi tạo đối tƣợng này và sử dụng phƣơng thức open() để bật kết nối với CSDL.

public tbSachDAL() { cn = new SqlConnection(ConfigurationManager .ConnectionStrings["strConnection"] .ConnectionString); cn.Open(); } 2.3.3. Phƣơng thức Insert

Phƣơng thức Insert dùng để thêm đối tƣợng tbSach vào Cơ Sở Dữ Liệu. Phƣơng thức này nhận vào đối tƣợng EntitiestbSach.

Chúng ta khai báo đối tƣợng SqlCommand và khởi tạo đối tƣợng đó với hai tham số là: tên của Store Proceduce: sp_tbSach_Insert và đối tƣợng SqlConnection mà chúng ta đã khởi tạo ở hàm khởi tạo đối tƣợng Data Access Layer.

Sau khi khởi tạo đối tƣợng SqlCommand, chúng ta cần truyền các tham số vào cho

Store Proceduce và gọi phƣơng thức ExecuteNonQuery() để thực thi Store Procedure:

sp_tbSach_Insert.

public void Insert(tbSach sach) {

SqlCommand cm = new SqlCommand("sp_tbSach_Insert", cn);

cm.CommandType = CommandType.StoredProcedure;

cm.Parameters.AddWithValue("@TenSach", sach.TenSach);

cm.Parameters.AddWithValue("@DonGia", sach.DonGia);

cm.Parameters.AddWithValue("@MoTa", sach.MoTa);

cm.Parameters.AddWithValue("@HinhMinhHoa",

sach.HinhMinhHoa);

cm.Parameters.AddWithValue("@MaCD", sach.MaCD);

cm.Parameters.AddWithValue("@MaNXB", sach.MaNXB);

cm.Parameters.AddWithValue("@NgayCapNhat",

sach.NgayCapNhat);

cm.Parameters.AddWithValue("@SoLuongBan",

sach.SoLuongBan);

cm.Parameters.AddWithValue("@SoLanXem", sach.SoLanXem);

cm.Parameters.AddWithValue("@MaTG", sach.MaTG);

}

2.3.4. Phƣơng thức Update

Phƣơng thức Update dùng để chỉnh sửa đối tƣợng tbSach trong Cơ Sở Dữ Liệu. Phƣơng thức này nhận vào đối tƣợng EntitiestbSach.

Chúng ta khai báo đối tƣợng SqlCommand và khởi tạo đối tƣợng đó với hai tham số là: tên của Store Proceduce: sp_tbSach_Update và đối tƣợng SqlConnection mà chúng ta đã khởi tạo ở hàm khởi tạo đối tƣợng Data Access Layer.

Sau khi khởi tạo đối tƣợng SqlCommand, chúng ta cần truyền các tham số vào cho

Store Proceduce và gọi phƣơng thức ExecuteNonQuery() để thực thi Store Procedure:

sp_tbSach_Update.

public void Update(tbSach sach) {

SqlCommand cm = new SqlCommand("sp_tbSach_Update", cn);

cm.CommandType = CommandType.StoredProcedure;

cm.Parameters.AddWithValue("@MaSach", sach.MaSach);

cm.Parameters.AddWithValue("@TenSach", sach.TenSach);

cm.Parameters.AddWithValue("@DonGia", sach.DonGia);

cm.Parameters.AddWithValue("@MoTa", sach.MoTa);

cm.Parameters.AddWithValue("@HinhMinhHoa",

sach.HinhMinhHoa);

cm.Parameters.AddWithValue("@MaCD", sach.MaCD);

cm.Parameters.AddWithValue("@MaNXB", sach.MaNXB);

cm.Parameters.AddWithValue("@NgayCapNhat",

sach.NgayCapNhat);

cm.Parameters.AddWithValue("@SoLuongBan",

sach.SoLuongBan);

cm.Parameters.AddWithValue("@SoLanXem", sach.SoLanXem);

cm.Parameters.AddWithValue("@MaTG", sach.MaTG);

cm.ExecuteNonQuery(); }

2.3.5. Phƣơng thức Delete

Phƣơng thức Delete dùng để xóa đối tƣợng tbSach trong Cơ Sở Dữ Liệu. Phƣơng thức này nhận vào ID của Sach cần xóa.

Chúng ta khai báo đối tƣợng SqlCommand và khởi tạo đối tƣợng đó với hai tham số là: tên của Store Proceduce: sp_tbSach_Delete và đối tƣợng SqlConnection mà chúng ta đã khởi tạo ở hàm khởi tạo đối tƣợng Data Access Layer.

Sau khi khởi tạo đối tƣợng SqlCommand, chúng ta cần truyền ID cần xóa vào cho

Store Proceduce và gọi phƣơng thức ExecuteNonQuery() để thực thi Store Procedure:

sp_tbSach_Delete.

public void Delete(int iD) {

SqlCommand cm = new SqlCommand("sp_tbSach_Delete", cn);

cm.CommandType = CommandType.StoredProcedure;

cm.Parameters.AddWithValue("@MaSach", iD);

cm.ExecuteNonQuery();

}

2.3.6. Phƣơng thức Get

Phƣơng thức Get dùng để lấy những đối tƣợng tbSach từ Cơ Sở Dữ Liệu thỏa mãn các điều kiện truyền vào. Phƣơng thức này nhận vào: Where, PageIndex, PageSize,

OrderBy, OrderDirection, trả về danh sách các tbSach và TotalRecords.

Chúng ta khai báo đối tƣợng SqlCommand và khởi tạo đối tƣợng đó với hai tham số là: tên của Store Proceduce: sp_tbSach_GET và đối tƣợng SqlConnection mà chúng ta đã khởi tạo ở hàm khởi tạo đối tƣợng Data Access Layer.

Sau khi khởi tạo đối tƣợng SqlCommand, chúng ta cần truyền các tham số vào cho Store Proceduce.

Chúng ta khai báo và khởi tạo đối tƣợng SqlDataReader từ đối tƣợng

SqlCommand. Đọc từng dòng dữ liệu, chuyển đổi thành đối tƣợng tbSach và thêm đối tƣợng này vào danh sách sản phẩm đƣợc khai báo thông qua đối tƣợng tbProductCollection.

Chúng ta nhận giá trị TotalRecords bằng cách parse giá trị của tham số

TotalRecords về giá trị int

public tbSachCollection Get(string where, int pageIndex, int pageSize,string orderBy,

{

SqlCommand cm = new SqlCommand("sp_tbSach_GET", cn);

cm.CommandType = CommandType.StoredProcedure;

cm.Parameters.AddWithValue("@Where", where);

cm.Parameters.AddWithValue("@PageIndex", pageIndex);

cm.Parameters.AddWithValue("@PageSize", pageSize);

cm.Parameters.AddWithValue("@OrderBy", orderBy);

cm.Parameters.AddWithValue("@OrderDirection",

orderDirection);

cm.Parameters.Add(new SqlParameter("@TotalRecords",

DbType.Int32)).Direction =

ParameterDirection.Output; SqlDataReader dr = cm.ExecuteReader();

tbSachCollection sachCollection = new tbSachCollection(); while (dr.Read())

{

tbSach sach = new tbSach();

sach.MaTG = int.Parse(dr.GetValue(0).ToString());

sach.TenSach = dr.GetValue(1).ToString();

sach.DonGia = int.Parse( dr.GetValue(2).ToString());

sach.MoTa = dr.GetValue(3).ToString();

sach.HinhMinhHoa = dr.GetValue(4).ToString();

sach.MaCD = int.Parse( dr.GetValue(5).ToString());

sach.MaNXB = int.Parse( dr.GetValue(6).ToString());

sach.NgayCapNhat =

DateTime.Parse( dr.GetValue(7).ToString());

sach.SoLuongBan = int.Parse( dr.GetValue(8).ToString()); sach.SoLanXem = int.Parse( dr.GetValue(9).ToString()); sach.MaTG = int.Parse(dr.GetValue(10).ToString()); sachCollection.Add(sach); } dr.Close(); totalRecords = int.Parse(

cm.Parameters["@TotalRecords"].Value.ToString()); return sachCollection;

}

2.4. XÂY DỰNG LỚP BUSINESS 2.4.1. Phƣơng thức Insert

Phƣơng thức Insert đƣợc khai báo là phƣơng thức static. Do đó chúng ta không cần phải khởi tạo đối tƣợng Bussiness để gọi phƣơng thức Insert.

Nếu có các quy định nghiệp vụ, chúng ta cần kiểm tra dữ liệu trƣớc khi Insert vào cơ sở dữ liệu. Trong ví dụ này chúng ta không có các quy định nghiệp vụ nên không cần kiểm tra.

Khai báo và khởi tạo đối tƣợng tbSachDAL, sau đó gọi phƣơng thức Insert để thêm đối tƣợng tbSach vào cơ sở dữ liệu.

public static void Insert(tbSach sach) {

tbSachDAL sachDAL = new tbSachDAL(); sachDAL.Insert(sach);

}

2.4.2. Phƣơng thức Update

Phƣơng thức Update đƣợc khai báo là phƣơng thức static. Do đó chúng ta không cần phải khởi tạo đối tƣợng Bussiness để gọi phƣơng thức Update.

Nếu có các quy định nghiệp vụ, chúng ta cần kiểm tra dữ liệu trƣớc khi Update đối tƣợng tbProduct trong cơ sở dữ liệu. Trong ví dụ này chúng ta không có các quy định nghiệp vụ nên không cần kiểm tra.

Khai báo và khởi tạo đối tƣợng tbSachDAL, sau đó gọi phƣơng thức Update để sửa đối tƣợng tbSach trong cơ sở dữ liệu.

public static void Update(tbSach sach) {

tbSachDAL sachDAL = new tbSachDAL(); sachDAL.Update(sach);

2.4.3. Phƣơng thức Delete

Phƣơng thức Delete đƣợc khai báo là phƣơng thức static. Do đó chúng ta không cần phải khởi tạo đối tƣợng Bussiness để gọi phƣơng thức Delete.

Nếu có các quy định nghiệp vụ, chúng ta cần kiểm tra dữ liệu trƣớc khi Delete đối tƣợng tbSach trong cơ sở dữ liệu. Trong ví dụ này chúng ta không có các quy định nghiệp vụ nên không cần kiểm tra.

Khai báo và khởi tạo đối tƣợng tbSachDAL, sau đó gọi phƣơng thức Delete để xóa đối tƣợng tbSach trong cơ sở dữ liệu.

public static void Delete(int iD) {

tbSachDAL sachDAL = new tbSachDAL(); sachDAL.Delete(iD);

}

2.4.4. Phƣơng thức Get

Phƣơng thức GET đƣợc khai báo là phƣơng thức static. Do đó chúng ta không cần phải khởi tạo đối tƣợng Bussiness để gọi phƣơng thức GET.

Khai báo và khởi tạo đối tƣợng tbSachDAL, sau đó gọi phƣơng thức GET và truyền vào các tham số cần thiết để lấy những tbSach trong cơ sở dữ liệu thích hợp.

public static tbSachCollection Get(string where, int pageindex, int pagesize,

string orderby, string orderdirection, out int total)

{

tbSachDAL sachDAL = new tbSachDAL();

return sachDAL.Get(where, pageindex, pagesize, orderby, orderdirection, out total);

}

2.4.5. Phƣơng thức GetAll

Trong nhiều trƣờng hợp, chúng ta có nhu cầu lấy hết tất cả dữ liệu có trong bảng

public static tbSachCollection GetAll() {

int total = 0;

tbSachDAL sachDAL = new tbSachDAL(); return sachDAL.Get("where 1=1", 0, 0,

tbSachColumns.MaSach.ToString(), "ASC", out total);

}

2.4.6. Phƣơng thức GetByID

Phƣơng thức GetByID dùng để lấy đối tƣợng có ID trùng với ID truyền vào. Phƣơng thức này chỉ trả về đối tƣợng tbSach nếu tìm thấy. Nếu không phƣơng thức này sẽ trả về null.

public static tbSach GetByID(int iD) {

int total = 0;

tbSachDAL sachDAL = new tbSachDAL();

tbSachCollection sachCollection = sachDAL.Get("where " + tbSachColumns.MaSach.ToString() + "=" + iD.ToString(), 0, 0, tbSachColumns.MaSach.ToString(), "ASC", out total); if (sachCollection.Count > 0)

return sachCollection[0]; return null;

Chƣơng 3. XÂY DỰNG PHÂN HỆ QUẢN LÝ 3.1. TẠO TRANG MASTER PAGE

3.1.1. Tạo trang Master Page

Nhấp chuột phải vào thƣ mục cần tạo trang Master Page  chọn mục “Add New Item” nhƣ hình.

Chọn loại file cần tạo là Master Page, đặt lại tên nếu cần thiết, chọn ngôn ngữ là C# và nhấp chuột vào nút “Add” để tạo trang Master Page.

3.1.2. Thiết kế giao diện cho trang Master Page

Thiết kế trang Master Page nhƣ hình. Giao diện gồm 3 phần chính: Menu chức năng, ContentPlaceHolder dàng cho Sub Menu, ContentPlaceHolder để hiển thị nội dung chính.

3.1.3. Kiểm tra đăng nhập

Nếu Session “UserName” chƣa đƣợc tạo ra thì chƣơng trình sẽ trả về trang đăng nhập.

protected void Page_Load(object sender, EventArgs e) {

if (Request.Url.ToString().Contains("Default.aspx") ==

false

&& Session["UserName"] == null)

Response.Redirect("~/Admin/Default.aspx"); }

3.2. XÂY DỰNG CHỨC NĂNG ĐĂNG NHẬP 3.2.1. Thiết kế giao diện cho trang đăng nhập 3.2.1. Thiết kế giao diện cho trang đăng nhập

<div style="padding:12px 12px 12px 12px;"> <div>

<div class="title">

Đăng nhập

</div> <div>

<table width="100%" cellspacing="1" cellpadding="3"

border="0" bgcolor="#cccccc">

<tr>

<td style="width:30%">Tài khoản</td>

<td style="width:70%">

<asp:TextBox ID="txt_TaiKhoan"

runat="server"></asp:TextBox>

</td>

</tr> <tr>

<td style="width:30%">Mật khẩu</td>

<td style="width:70%">

<asp:TextBox ID="txt_MatKhau"

TextMode="Password" runat="server"></asp:TextBox>

</td>

</tr>

<tr>

<td style="width:30%"></td>

<td style="width:70%">

<asp:Button ID="btn_DangNhap"

runat="server" Text="Đăng nhập" OnClick="btn_DangNhap_Click" />

</td>

</tr> <tr>

<td style="width:70%">

<asp:Label ID="lb_Error"

runat="server" ForeColor="red"></asp:Label>

</td> </tr> </table> </div> </div> </div> 3.2.2. Xử lý đăng nhập

Lấy danh sách nhân viên có tài khoản mà ngƣời dùng nhập, nếu danh sách tồn tại thì chúng ta tiến hành xét mật khẩu của ngƣời dùng nhập có trùng với mật khẩu trong cơ sở dữ liệu không?

protected void btn_DangNhap_Click(object sender, EventArgs e) {

Criteria cri = new Criteria(); cri.add(Condition.AND,

tbNhanVienColumns.TaiKhoan.ToString(), Condition.EQUAL, txt_TaiKhoan.Text);

int total = 0;

tbNhanVienCollection nhanVienCollection =

tbNhanVienBUS.Get(

cri.Criter, 0, 0, tbNhanVienColumns.Ma.ToString(),

OrderDirection.ASC.ToString(), out total); if (nhanVienCollection.Count > 0)

{

if (nhanVienCollection[0].MatKhau == txt_MatKhau.Text) {

Session["UserName"] = txt_TaiKhoan.Text; Response.Redirect("~/Admin/SachList.aspx"); }

else

{

lb_Error.Text = "Mat khau sai. Vui long dang nhap lai";

} } else

{

lb_Error.Text = "Tai khoan khong ton tai. Vui long dang nhap lai";

} }

3.3. XÂY DỰNG CHỨC NĂNG XEM DANH SÁCH SẢN PHẨM 3.3.1. Tạo trang danh sách sản phẩm 3.3.1. Tạo trang danh sách sản phẩm

Chọn loại file là Web Form và check vào checkbox “Select master page”, sau đó nhấp chuột vào nút “Add”.

Trong hộp thoại “Select a Master Page”, ta chọn đƣờng dẫn đến trang Master Page của trang Web, sau đó nhấp chuột vào nút “OK”.

3.3.2. Thiết kế giao diện

Sub Menu chứa liên kết đến với các trang liên quan khác trong mục Sản phẩm: Chủ đề, tác giả, nhà xuất bản, sách.

<asp:Content ID="Content1" ContentPlaceHolderID="menuPlaceHolder"

Runat="Server"> <h5>Menu</h5>

<ul class="Actions">

<li><a href="ChuDeList.aspx">Danh sách chủ đề</a></li> <li><a href="ChuDeAdd.aspx">Thêm mới chủ đề</a></li> </ul>

<li>

<a href="TacGiaList.aspx">Danh sách tác giả</a> </li>

<li><a href="TacGiaAdd.aspx">Thêm mới tác giả</a></li> </ul> <ul class="Actions"> <li><a href="NhaXuatBanList.aspx"> Danh sách nhà xuất bản</a> </li> <li><a href="NhaXuatBanAdd.aspx"> Thêm mới nhà xuất bản</a> </li>

</ul>

<ul class="Actions">

<li class="Selected"><a href="SachList.aspx"> Danh sách Sách</a>

</li>

<li><a href="SachAdd.aspx">Thêm mới Sách</a></li> </ul>

</asp:Content>

Chức năng search sách theo tên sách, chủ đề, nhà xuất bản, tác giả. Trong đó tên sách là TextBox, còn lại là DropDownList.

<div style="display:table-cell; width:70%;float:left;"> Tên sách:

<asp:TextBox ID="txt_TenSach" runat="server"></asp:TextBox>

Chủ đề: <asp:DropDownList ID="ddl_ChuDe"

CssClass="DropDownList" runat="server"></asp:DropDownList>

NXB: <asp:DropDownList ID="ddl_NXB"

CssClass="DropDownList" runat="server"></asp:DropDownList>

Tác giả: <asp:DropDownList ID="ddl_TacGia"

CssClass="DropDownList" runat="server"></asp:DropDownList>

<asp:Button ID="btn_Search" runat="server"

Text="Tìm kiếm" /> </div>

Danh sách Sách sẽ đƣợc biểu diễn bằng một Repeater gồm có các cột: Mã, tên sách, chủ đề, hình ảnh, đơn giá, nhà xuất bản, tác giả, sửa và xóa. Trong đó, cột sửa là liên kết đến trang chỉnh sửa Sách, cột xóa là các CheckBox để ngƣời dùng chọn để xóa.

<asp:Repeater ID="Repeater1" runat="server"

OnItemDataBound="Repeater1_ItemDataBound"> <HeaderTemplate>

<table cellspacing="1" cellpadding="3" width="100%"

bgcolor="#cccccc" border="0"> <thead> <tr class="listtableheader"> <th>Mã</th> <th>Tên Sách</th> <th>Chủ đề</th> <th>Hình Ảnh</th> <th>Đơn giá</th> <th>Nhà xuất bản</th> <th>Tác giả</th> <th>Sửa</th>

<th><input id="cb_All" type="checkbox" onclick="CheckAll(1);" /> <a href="javascript:CheckAll(2)"> Chọn hết</a> </th> </tr> </thead> <tbody> </HeaderTemplate> <ItemTemplate> <tr>

<td><asp:Literal ID="lit_Ma" runat="server" /></td> <td><asp:HyperLink ID="hyp_TenSach"

runat="server"></asp:HyperLink></td>

<td><asp:Literal ID="lit_MaCD" runat="server" /></td> <td>

<asp:Image ID="img_HinhAnh" runat="server" /> </td>

<td><%#Eval("DonGia") %></td>

<td><asp:Literal ID="lit_MaNXB" runat="server" /></td> <td><asp:Literal ID="lit_MaTG" runat="server" /></td> <td><asp:HyperLink ID="hpl_Edit" Text="Edit"

runat="server" /></td> <td>

<asp:CheckBox ID="cb_Xoa" runat="server" /> <asp:HiddenField ID="hf_id" runat="server" /> </td> </tr> </ItemTemplate> <FooterTemplate> </tbody> </table> </FooterTemplate> </asp:Repeater>

Sử dụng control ASPNetPager để phân trang cho danh sách sản phẩm.

<pagerv2:pagerv2_8 ID="hyperlinkPager" runat="server" ]

GenerateFirstLastSection="true" OnCommand="pager_Command"

GeneratePagerInfoSection="false" GenerateSmartShortCuts="false" GenerateHiddenHyperlinks="false" NormalModePageCount="5" />

3.3.3. Xử lý Page Load

Hàm Page_Load dùng để tải các dữ liệu ban đầu lên cho trang Web. Đầu tiên ta tải dữ liệu cho tất cả các DropDownList, và sau đó tải dữ liệu cho repeater

protected void Page_Load(object sender, EventArgs e) { if (!IsPostback) { LoadDropDownList(); LoadData(); } }

private void LoadDropDownList() {

ddl_ChuDe.DataSource = tbChuDeBUS.GetAll();

ddl_ChuDe.DataTextField = tbChuDeColumns.TenChuDe.ToString(); ddl_ChuDe.DataValueField = tbChuDeColumns.MaCD.ToString(); ddl_ChuDe.DataBind();

ddl_ChuDe.Items.Insert(0,new ListItem("All","0"));

ddl_NXB.DataSource = tbNhaXuatBanBUS.GetAll();

ddl_NXB.DataTextField = tbNhaXuatBanColumns.TenNXB.ToString(); ddl_NXB.DataValueField = tbNhaXuatBanColumns.MaNXB.ToString(); ddl_NXB.DataBind();

ddl_NXB.Items.Insert(0,new ListItem("All", "0"));

ddl_TacGia.DataSource = tbTacGiaBUS.GetAll();

ddl_TacGia.DataTextField = tbTacGiaColumns.Ten.ToString(); ddl_TacGia.DataValueField = tbTacGiaColumns.MaTG.ToString(); ddl_TacGia.DataBind();

ddl_TacGia.Items.Insert(0, new ListItem("All", "0"));

}

private void LoadData() {

Criteria cri = new Criteria(); int total = 0; if (txt_TenSach.Text != "") cri.add(Condition.AND, tbSachColumns.TenSach.ToString(), Condition.LIKE, txt_TenSach.Text); if(ddl_ChuDe.SelectedValue != "0") cri.add(Condition.AND, tbSachColumns.MaCD.ToString(), Condition.EQUAL, int.Parse(ddl_ChuDe.SelectedValue)); if (ddl_NXB.SelectedValue != "0") cri.add(Condition.AND, tbSachColumns.MaNXB.ToString(), Condition.EQUAL, int.Parse(ddl_NXB.SelectedValue)); if (ddl_TacGia.SelectedValue != "0") cri.add(Condition.AND, tbSachColumns.MaTG.ToString(), Condition.EQUAL, int.Parse(ddl_TacGia.SelectedValue));

hyperlinkPager.PageSize =

int.Parse(ConfigurationManager.AppSettings["pagesize"].ToString()); tbSachCollection sachCollection = tbSachBUS.Get(cri.Criter, hyperlinkPager.CurrentIndex, hyperlinkPager.PageSize,

tbSachColumns.MaSach.ToString(), OrderDirection.ASC.ToString(), out total); Repeater1.DataSource = sachCollection; Repeater1.DataBind(); hyperlinkPager.ItemCount = total; if (total <= hyperlinkPager.PageSize) hyperlinkPager.Visible = false; }

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { HyperLink hyp_TenSach = (HyperLink)e.Item.FindControl("hyp_TenSach"); HyperLink hpl_Edit = (HyperLink)e.Item.FindControl("hpl_Edit");

Literal lit_Ma = (Literal)e.Item.FindControl("lit_Ma");

HiddenField hf_id =

(HiddenField)e.Item.FindControl("hf_id");

Literal lit_MaCD = (Literal)e.Item.FindControl("lit_MaCD");

Literal lit_MaNXB =

(Literal)e.Item.FindControl("lit_MaNXB");

Literal lit_MaTG = (Literal)e.Item.FindControl("lit_MaTG");

Image img_HinhAnh =

(Image)e.Item.FindControl("img_HinhAnh");

tbSach sach = (tbSach)e.Item.DataItem;

if(chuDe != null) lit_MaCD.Text = chuDe.TenChuDe; tbNhaXuatBan nhaXuatBan = tbNhaXuatBanBUS.GetByID(sach.MaNXB); if (nhaXuatBan != null) lit_MaNXB.Text = nhaXuatBan.TenNXB;

tbTacGia tacGia = tbTacGiaBUS.GetByID(sach.MaTG); if (tacGia != null) lit_MaTG.Text = tacGia.Ten; img_HinhAnh.ImageUrl = "~/Photos/Thumb/" + sach.HinhMinhHoa; lit_Ma.Text = sach.MaSach.ToString(); hyp_TenSach.NavigateUrl = "SachDetail.aspx?id=" + sach.MaSach.ToString(); hpl_Edit.NavigateUrl = "SachEdit.aspx?id=" + sach.MaSach.ToString(); hf_id.Value = sach.MaSach.ToString(); hyp_TenSach.Text = sach.TenSach.ToString(); } }

3.3.4. Xử lý chức năng phân trang

Để phân trang ta sử dụng control AspNetPager miễn phí. Sau khi thiết kế giao diện ở phần trƣớc ta định nghĩa thêm hàm Command nhƣ sau:

protected void pager_Command(object sender, CommandEventArgs e) {

hyperlinkPager.CurrentIndex = Convert.ToInt32(e.CommandArgument); LoadData();

3.3.5. Chức năng xóa

Để xóa Sách, ta duyệt qua tất cả các row trong repeater. Nếu dòng nào đƣợc check thì ta tiến hành xóa dòng đó ra khỏi cơ sở dữ liệu

protected void lbt_Delete_Click(object sender, EventArgs e) {

foreach (RepeaterItem item in this.Repeater1.Items) {

CheckBox chk = (CheckBox)item.FindControl("cb_Xoa");

if (chk.Checked == true) { HiddenField hf_id = (HiddenField)item.FindControl("hf_id"); tbSachBUS.Delete(int.Parse(hf_id.Value)); } } LoadData(); } 3.3.6. Chức năng tìm kiếm

Chúng ta đã thiết kế hàm tải dữ liệu thích hợp cho việc tìm kiếm, vì thế khi ngƣời dùng nhấp chuột vào nút tìm kiếm chúng ta chỉ việc gọi lại làm tải dữ liệu.

protected void btn_Search_Click(object sender, EventArgs e) {

LoadData(); }

3.4. XÂY DỰNG CHỨC NĂNG THÊM SẢN PHẨM 3.4.1. Thiết kế giao diện cho trang thêm sản phẩm 3.4.1. Thiết kế giao diện cho trang thêm sản phẩm

<div>

<div class="title">

Thêm mới sách

Một phần của tài liệu CÔNG NGHỆ WEB NÂNG CAO XÂY DỰNG WEBSITES VỚI ASP.NET 2.0 (Trang 28)

Tải bản đầy đủ (PDF)

(93 trang)