Cách tạo và xử lý giỏ hàng trong ASP.Net

Chào mọi người, trong các vấn đề cơ bản của học thiết kế web là tạo và xử lý giỏ hàng, tuy nói là cơ bản nhưng được đánh giá là rất khó, hôm nay mình chia sẻ với các bạn cách thiết lập một giỏ hàng đơn giản trong ASP.Net

Một website bán hàng ngoài các vấn đề về sản phẩm, khuyến mãi, khách hàng… thì giỏ hàng và đơn hàng là một trong các tính năng không thể thiếu, nó mang cho phép người dùng chọn mua sản phẩm, nhóm sản phẩm, đặt hàng online, cho phép bạn đánh giá doanh thu, thông kê đơn hàng … với một giỏ hàng chuyên nghiệp đầy đủ các tính năng thì còn nói lên sự chuyên nghiệp trong dịch vụ của bạn.

1. Mô tả CSDL

Không nói dông dài nữa, ai cũng biết tầm quan trọng của nó rồi thì bây giờ mình tiến hành vào phâm tích vấn đề mình cần làm. Muốn thiết lập và xử lý giỏ hàng bạn cần xét các trường liên quan như: sản phẩm, khách hàng hai thành phầm trực tiếp đó trả lời cho hai câu hỏi, ai mua? và mua gì?

Ngoài ra nó còn phát sinh ra đơn hàng, chi tiết đơn hàng vì khi chọn sản phẩm lưu vào thì phải có bảng lưu đó là đơn hàng, tuy nhiên trong một đơn hàng có một hay nhiều sản phẩm do đó phải phát sinh ra chi tiết đơn hàng. Nếu phân tích sâu thì bạn có thêm phương thức thanh toán… Mời bạn tham khảo phần phân tích cơ sở dữ liệu sẽ nắm rõ hơn.

Mô tả CSDL thiết lập giỏ hàng ASP.Net

Mô tả CSDL thiết lập giỏ hàng ASP.Net

2. Thiết lập giỏ hàng ASP.Net

Đầu tiên mình sẽ vào phân tích các file phát sinh trong lúc mình tạo giỏ hàng ASP.Net: trang thứ nhất là trang dùng trình bày các sản phẩm, thường là trang chủ, trang thể loại sản phẩm, chi tiết sản phẩm … tiếp theo trang giỏ hàng, trang thanh toán … ngoài ra còn các tràng thông báo khi cần thiết…

Trong trang hiển thị sản phẩm bạn cần xem lại bài: Sử dụng – đổ dữ liệu vào DataList trong ASP.Net trong này cần chú ý đến nút mua hàng, bạn khai báo như hình sau:

Tùy chỉnh nút mua hàng ASP.Net

Tùy chỉnh nút mua hàng ASP.Net

Bạn vào trang hiển thị sản phẩm ở đây mình ví dụ là TrangChu.aspx cho dễ nha! Mở trang TrangChu.cs lên bạn khai báo:

<!--
    static DataTable tbGioHang = new DataTable();
-->

Xin nhắc lại là đến đây bạn đã có giao diện rồi nha, khai báo trên giống như một đối tượng, ở đây bạn hiểu là một biến có kiểu là table cũng được nó sẽ là nơi lưu trữ tạm thời các dữ liệu của giỏ hàng bạn trươc khi phiên giao dịch kết thúc.

Tiếp đến bạn vào trong Page_Load khai báo như sau:

<!--
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Session["GioHang"] != null)
            {
                tbGioHang = Session["GioHang"] as DataTable;
            }
            else
            {
                tbGioHang.Rows.Clear();
                tbGioHang.Columns.Clear();
                tbGioHang.Columns.Add("idSP", typeof(int));
                tbGioHang.Columns.Add("TenSP", typeof(string));
                tbGioHang.Columns.Add("Gia", typeof(double));
                tbGioHang.Columns.Add("SoLuong", typeof(int));
                tbGioHang.Columns.Add("TongTien", typeof(double), "SoLuong * Gia");
            }
            load_data();
        }
    }
-->

Nếu giỏ hàng của chúng ta là null thì gáng biến Session["GioHang"] nếu chưa rõ biến session thì bạn xem lại bài đối tượng cookies và session trong ASP.Net. Nếu đã có rồi thì mình sẽ xóa sạch các dữ liệu và tiến hành phiên làm việc, mình add các trường như: idSP (int), TenSP (string), Gia (double), SoLuong (int), TongTien (double) vào trong bảng table đã khai báo sau đó tiến hành load lại dữ liệu (hàm load_data xem lại bài trước).

Tiếp theo bạn xử lý nút mua hàng, lúc nảy mình đã mình đã đặt tên cho Command nút mua hàng do đó vào kích hoạt phần ItemCommand của DataList sản phẩm mới sử dụng được, ItemCommand cho phép bạn xử lý theo CommandName rất dễ chịu và tiện cho chúng ta quản lý các item. Bạn Click vào DataList sản phẩm và nhìn vào thanh thuộc tính làm theo hình.

ItemCommand trong Datalist

ItemCommand trong Datalist

<!--
protected void dlSanPham_ItemCommand(object source, DataListCommandEventArgs e)
    {
        if (e.CommandName == "ibtMuaHang")
        {
            if (Session["UserName"] == null)
            {
                Response.Redirect("Login.aspx");
            }
            else
            {
                int intidSP = int.Parse(dlSanPham.DataKeys[e.Item.ItemIndex].ToString());
                string strTenSP = ((LinkButton)e.Item.FindControl("lbtTenSanPham")).Text;
                float flGia = float.Parse(((Label)e.Item.FindControl("lbGia")).Text);
                int intSoLuong = 1;

                //Add vao gio hang

                foreach (DataRow row in tbGioHang.Rows)
                {//Kiem tr neu mat hang da co roi thi tang so luong len 1
                    if ((int)row["idSP"] == intidSP)
                    {
                        row["SoLuong"] = (int)row["SoLuong"] + 1;
                        goto GioHang;
                    }
                }
                tbGioHang.Rows.Add(intidSP, strTenSP, flGia, intSoLuong);
            GioHang:
                Session["GioHang"] = tbGioHang;

                Response.Write("<script>alert('Đã thêm vào giỏ hàng ^.*!...')</script>");
            }
            
        }
    }
-->

Đoạn code sau cho thấy được, nếu là CommandName đang xét là “ibtMuaHang” thì xử lý, muốn mua hàng bạn phải bắt người dùng đăng nhập để có thông tin cho đơn hàng chúng ta. Nếu Session["UserName"] mà có giá trị null thì mình Redirect đến trang đăng nhập.

Khi mình bấm vào nút mua hàng thì bạn có cách hiểu về hoạt động các biến như sau: intidSP là lấy giá trị key của DataList ép về kiểu int, strTenSP lấy từ control lbtTenSanPham ép về kiểu string, flGia giá lấy từ control lbGia ép về kiểu float, số lượng intSoLuong khai báo bằng 1 sau đó mình add chúng vào tbGioHang. Khi thành công thì thông báo.

Lúc này xem như đã xong phần trang hiển thị sản phẩm, bạn đi tiếp trang giỏ hàng GioHang.apspx, trang này mình cần xử lý rất nhiều, bạn nhìn giao diện mẫu hiển thị lên như sau và thiết kế một layout cho nó, ở đây sử dụng gridview.

Thông tin giỏ hàng đã chọn

Thông tin giỏ hàng đã chọn

Ở trang giỏ hàng bạn vẫn phải khái báo biến tỉnh giỏ hàng như ở trang show sản phẩm để lấy thông tin từ table trang kia truyền qua.

     static DataTable tbGioHang = new DataTable();

Tiếp theo mình sẽ load dữ liệu lên GridView hiển thị thông tin các sản phẩm chọn mua.

<!--
private void load_data()
    {
        if (Request.QueryString["ProID"] != null)
        {
            int idSP = int.Parse(Request.QueryString["ProID"]);
            DataTable dt = data.get("Select ProName,Price From Products where ProID=" + idSP).Tables[0];
            String TenSP = dt.Rows[0][0].ToString();
            int Dongia = int.Parse(dt.Rows[0][1].ToString());
            int Soluong = 1;
            ThemVaoGioHang(idSP, TenSP, Dongia, Soluong);
        }
        if (Session["GioHang"] == null)
        {
            Response.Redirect("GioHangRong.aspx");
        }
        tbGioHang = (DataTable)Session["GioHang"];
        string strnumber = tbGioHang.Compute("Sum(TongTien)", "").ToString();
        lbTongTien.Text = strnumber;
        gvGioHang.DataSource = tbGioHang;
        gvGioHang.DataBind();
    }
-->

Tiếp theo sau đây là hàng loạt chuổi các hàm liên quan với nhau nói chung cũng có chút phức tạp các bạn phải ghú ý hi.. Quên vấn đề nữa, các control trong trang giỏ hàng này là: GridView, lable tổng tiền, button mua tiếp, button xóa giỏ hàng, button cập nhật khi có thay đổi, và đặt hàng. Bạn nhận thấy trong hàm load dữ liệu có hàm thêm vào giỏ hàng, hàm này sẽ có tác dụng cho việc mua tiếp hàng mà không mất sản phẩm trong table. Sau đây là hàm thêm vào giỏ hàng.

<!--
public void ThemVaoGioHang(int idSP, string TenSP, int Dongia, int Soluong)
    {
        DataTable dt;
        if (Session["GioHang"] == null)
        {
            dt = new DataTable();
            dt.Columns.Add("idSP");
            dt.Columns.Add("TenSP");
            dt.Columns.Add("Gia");
            dt.Columns.Add("SoLuong");
            dt.Columns.Add("TongTien");
        }
        else
            dt = (DataTable)Session["GioHang"];
        int dong = SPdacotronggiohang(idSP, dt);
        if (dong != -1)
        {
            dt.Rows[dong]["SoLuong"] = Convert.ToInt32(dt.Rows[dong]["SoLuong"]) + Soluong;
        }
        else
        {
            DataRow dr = dt.NewRow();
            dr["idSP"] = idSP;
            dr["TenSP"] = TenSP;
            dr["Gia"] = Dongia;
            dr["SoLuong"] = Soluong;
            dr["TongTien"] = Dongia * Soluong;
            dt.Rows.Add(dr);
        }
        Session["GioHang"] = dt;
    }
-->

Bạn nhận thấy trong đó có phát sinh hàm lấy dòng, là SPdacotronggiohang, thật sự cũng chẳng biết đặt tên như thế nào :) nhưng hàm này sẽ trả về kiểu int là dòng hiện tại của table.

<!--
    public static int SPdacotronggiohang(int idSP, DataTable dt)
    {
        int dong = -1;
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            if (int.Parse(dt.Rows[i]["idSP"].ToString()) == idSP)
            {
                dong = i;
                break;
            }
        }
        return dong;
    }
-->
Eo ơi giỏ hàng ASP.Net

Eo ơi giỏ hàng ASP.Net

Tiếp đến mình sẽ xử lý các nút trong giỏ hàng của mình như sau, nút nào dễ làm trước :D bắt đầu từ nút mua tiếp, khi đã xem giỏ hàng nhưng chưa đồng ý người ta có thể mua tiếp thì mình cho khách đến Trang chủ.

<!--
    protected void ibtMuaTiep_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect("~/TrangChu.aspx");
    }
-->

Tiếp theo là đặt hàng, nút này tương tự như mua tiếp mình sẽ dẫn khách đến trang đặt hàng.

<!--
    protected void ibtDatHang_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect("~/DatHang.aspx");
    }
-->

Sau đó là nut xóa giỏ hàng, hii nút này còn dễ ác nữa.

<!--
    protected void ibtXoaGioHang_Click(object sender, ImageClickEventArgs e)
    {
        Session["GioHang"] = null;
        Response.Redirect("~/TrangChu.aspx");
    }
-->

Tiếp tục là một nút khó nhất trong cái đám nằm ngang đó là cập nhật giỏ hàng, khi mình thay đổi số lượng … trên gridview giỏ hàng thì muốn cập nhật thông số đó.

<!--
protected void ibtCapNha_Click(object sender, ImageClickEventArgs e)
    {
        try
        {
            DataTable dt = (DataTable)Session["GioHang"];
            foreach (GridViewRow r in gvGioHang.Rows)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    if (int.Parse(gvGioHang.DataKeys[r.DataItemIndex].Value.ToString()) == int.Parse(dr["idSP"].ToString()))
                    {
                        TextBox t = (TextBox)r.Cells[3].FindControl("txtSoLuong");
                        if (Convert.ToInt32(t.Text) <= 0)
                            dt.Rows.Remove(dr);
                        else
                            dr["SoLuong"] = t.Text;
                        break;
                    }
                }
            }
            Session["Giohang"] = dt;
            Response.Redirect("~/GioHang.aspx");
        }
        catch (Exception)
        {
            Response.Write("<script>alert('Đã Phát Sinh Lỗi, Vui Lòng Kiểm Tra Lại!...')</script>");
        }
    }
-->

Còn một vấn đề quan trong nữa mà suýt nữa mình quên là nút xóa tại dòng nằm trong GridView giỏ hàng của mình, bấm vào dòng nào thì xóa dòng đó. :D Lúc này bạn chọn vào GridView và vào thanh thuộc tính chọn như hình, ở DataList thì có ItemCommand ở GridView thì có RowCommand.

RowCommand trong GridView giỏ hàng ASP.Net

RowCommand trong GridView giỏ hàng ASP.Net

Nút đó được code như sau:

<!--
protected void gvGioHang_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "btXoa")
        {
            int chiso = int.Parse(e.CommandArgument.ToString());
            try
            {
                DataTable dt = (DataTable)Session["GioHang"];
                dt.Rows.RemoveAt(chiso);
                Session["GioHang"] = dt;
                Response.Redirect("~/GioHang.aspx");
            }
            catch
            {
                Response.Redirect("~/GioHang.aspx");
            }
        }
    }
-->
3. Tạo đơn đặt hàng trong ASP.Net

Những gì gian khổ nhất cũng đã trãi qua, bây giờ có lẽ sẽ nhẹ hơn nhiều rồi, tạo tính năng đặt hàng.

Đặt hàng trong ASP.Net

Đặt hàng trong ASP.Net

Như trên bạn có thể thấy được có một gridview hiển thị cho người dùng biết được các sản phẩm mà họ đã chọn mua, và những thông tin cần thiết khi bạn giao dịch với khác hàng ….

Tương tự ở đây hiện thông tin giỏ hàng thị bạn phải khai báo biến.

    DataTable tbGioHang = new DataTable();

Trong phần PageLoad bạn khai báo các thành phần sau đây:

<!--
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            load_methodPay();
        }
        
        if (Session["GioHang"] == null)
        {
            Response.Redirect("GioHangRong.aspx");
        }
        
        int idkh = int.Parse(Session["CusID"].ToString());
        tbGioHang = (DataTable)Session["GioHang"];


        string strnumber = tbGioHang.Compute("Sum(TongTien)", "").ToString();
        lbTongTien.Text = strnumber;
        gvDatHang.DataSource = tbGioHang;
        gvDatHang.DataBind();
        txtThoiGianDat.Text = DateTime.Now.Date.ToString();
    }
-->

Ở đây có một chổ khác đó là có lấy IdKH mã khách hàng để bạn add vào trong đơn hàng, để lúc admin bạn quản lý sẽ biết người khách hàng nào đã đặt. Còn phương thức thanh toán thì load từ CSDL lên mà thôi bạn làm như sau:

<!--
    public void load_methodPay()
    {
        string sql = "select PayID,PayName from PayMethod where Visible = 1";
        drlPhuongThucThanhToan.DataSource = data.get(sql).Tables[0];

        drlPhuongThucThanhToan.DataTextField = "PayName";
        drlPhuongThucThanhToan.DataValueField = "PayID";
        drlPhuongThucThanhToan.DataBind();
    }
-->

Bạn chú ý dùng Điều khiển kiểm tra dữ liệu validation control trong ASP.Net để kiển tra thông tin nhập từ người dùng sau đó bạn tiến hành code nút đặt hàng.

<!--
protected void ibtDatHang_Click(object sender, ImageClickEventArgs e)
    {
        int idkh = int.Parse(Session["CusID"].ToString());
        if (Session["GioHang"] == null)
        {
            Response.Redirect("~/GioHangRong.aspx");
        }
        int ngay = int.Parse(DateTime.Now.Day.ToString());
        int thang = int.Parse(DateTime.Now.Month.ToString());
        int nam = int.Parse(DateTime.Now.Year.ToString());

        string[] dmy = (txtThoiGianGiao.Text).Split('/');
        int dd = int.Parse(dmy[0].ToString());
        int mm = int.Parse(dmy[1].ToString());
        int yy = int.Parse(dmy[2].ToString());


        string sql1 = "insert into Orders values ('" + idkh + "','" + drlPhuongThucThanhToan.SelectedItem.Value.ToString() + "',N'" + txtTenNguoiNhan.Text + "','" + nam + "/" + thang + "/" + ngay + "','" + yy + "/" + mm + "/" + dd + "',N'" + txtDiaChi.Text + "',0,N'" + txtGhiChu.Text + "','" + txtSDT.Text + "')";
        data.ExeCuteNonQuery(sql1);
        string sql2 = "select OrdID from Orders";
        int idDH = 0;
        foreach (DataRow r in data.get(sql2).Tables[0].Rows)
        {
            idDH = int.Parse(r[0].ToString());
        }
        if (tbGioHang.Rows.Count > 0)
        {
            foreach (DataRow r in tbGioHang.Rows)
            {
                int idSP = int.Parse(r["idSP"].ToString());
                int SoLuong = int.Parse(r["SoLuong"].ToString());
                double Gia = double.Parse(r["Gia"].ToString());
                string sql3 = "insert into OrderDetails values('" + idDH + "','" + idSP + "','" + Gia + "','" + SoLuong + "')";
                data.ExeCuteNonQuery(sql3);
            }
        }
        Session["GioHang"] = null;
        Response.Redirect("~/DatHangThanhCong.aspx");
    }
-->

Kết luận: Ở đây insert vào hai bảng đơn hàng và chi tiết đơn hàng luôn. Hix, pà con thông cảm bài viết dài quá đâm ra đau đầu muốn chết, phần trước còn giải thích được nhiều càng về sau đuối quá, thôi cứ làm được cái đã rồi từ từ mình tính nha mọi người! Quên nữa, thật ra đây cũng chỉ là phần demo tính năng giỏ hàng thôi bạn có thể phát triển thêm nhiều hơn nếu muốn mang ra sử dụng:D ví dụ như: cho khác hàng có thể sửa lại đơn hàng trong thời gian nhất định nào đó, hủy đơn hàng và phát triển về phương thức thanh toán online…. Chúc thành công.

CÁC CLASS CƠ BẢN TRONG GIỎ HÀNG DEMO PHÍA TRÊN

VN:F [1.9.22_1171]
Rating: 9.7/10 (24 votes cast)
Cách tạo và xử lý giỏ hàng trong ASP.Net, 9.7 out of 10 based on 24 ratings
Chuyên mục: ASP.Net & SQL Server, Lập Trình
Tagged: , , .

95 Comments

  1. Trung

    bạn ơi cho mình hỏi. mình code xong hết rồi nhưng mà đến lúc chạy thì nó báo có lỗi ở hàm này dlSanPham_ItemCommand.
    Nó báo thế này “Invalid postback or callback argument. Event validation is enabled using in configuration or in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.” bạn giúp mình với. khi mình ấn vào nút ibtmuahang ấy

    • namnguyen1251

      Mình cũng bị như bạn.Lỗi này là sao nhi? Ai giúp mình vs đc ko?

  2. Bài này cũng vậy rất hay và bổ ích
    Chúc bạn thành công và may mắn

  3. Võ Huy

    Cho mình hỏi dòng code này (hàm Load_data): DataTable dt = data.get(“Select ProName,Price From Products
    where ProID=” + idSP).Tables[0];
    Biến data là khai báo ở đâu vậy? Mình tìm hoài mà không thấy.

    • data là đối tượng mình tạo ra từ Class dataProvider, mình có đề cập cho các bạn phải xem các bài trước đó

           dataProvider data = new dataProvider();
      

      • Võ Huy

        Cảm ơn bạn nhe! Cho mình hỏi thêm 1 câu nữa nha: ở sự kiện ibtCapNha_Click mình bị báo lỗi ngay dòng: gvGioHang.DataKeys[r.DataItemIndex].Value.ToString();
        Lí do: “Index was out of range. Must be non-negative and less than the size of the collection.
        Parameter name: index”.
        Mình không rõ chỗ này cho lắm, bạn có thể giải thích thêm được không?

        • ducdinh

          cái này do bạn chưa khai báo dataKeys vào grvGiohang. Bạn nhấp vào grvGiohang chọn thuộc tính này DataKeyNames, nhập cho nó cái tên của mã sản phẩm bạn đặt trong database.

      • Võ Huy

        Sorry bạn nha, do mình chưa set thuộc tính datakeyname của gridview nên báo lỗi trên.

      • Hoàn

        Bài hướng dẫn của ông cứ lộn xộn kiểu gì ấy. nếu có thêm cái gì của phần trước thì cũng nói vào hoặc copy vào. Làm thì cho nó hoàn chỉnh đi. Lỗi lộn tùng phèo. Chỉ có mỗi code mà cũng không chạy nổi nói gì đến hướng dẫn!

        • Bác cứ bức xúc, chẳng lẻ mỗi lần nhắc bài củ em lại copy hết bài đó vào. Còn làm thì có lỗi bác phải sửa hay support. Chứ bài của em chạy OK và có nhiều bác đã làm được rồi. Bác xem kỹ tí đi!

        • hung

          code trên cứ lộn xộn, làm ko ro ràng lắm, bạn có code giỏ hàng, phan trang ko gui qua mail minh voi nhe:

          • Bác đọc bài không kỷ ak! Ở dưới cuối bài có link down về đóa! Còn phân trang thì vào trong List bài viết ASP.Net tìm bạn, vì k bít bạn phân theo DataList hay GridView.

  4. :) Rất vì đã góp ý!

  5. Phan

    Mình ấn vào imagebutton”ĐặtHàng”.
    int intidSP = int.Parse(dlSanPham.DataKeys[e.Item.ItemIndex].ToString());
    Nó báo lỗi chỗ dòng này với nội dung sau:
    Index was out of range. Must be non-negative and less than the size of the collection.
    Parameter name: index
    ->Bạn giúp mình với hix hix

  6. fanIT

    Ban oi cho minh hoi sao khi bam vao xoa thi bao la Input string was not in a correct format. khong the xoa dc ha ban.

     if (e.CommandName == "btXoa")
            {
                int chiso = int.Parse(e.CommandArgument.ToString()); //dong nay ne
                try
                {
                    DataTable dt = (DataTable)Session["GioHang"];
                    dt.Rows.RemoveAt(chiso);
                    Session["GioHang"] = dt;
                    Response.Redirect("~/GioHang.aspx");
                }
                catch
                {
                    Response.Redirect("~/GioHang.aspx");
                }
            }
    

    • Mình cũng k rõ, dòng bạn đánh dấu là không sai, bạn nên debug để tìm kiếm lỗi! có thể sẽ không ở chổ đó! :)

  7. Phan

    CusID lấy ở đâu zị bạn ơi. Hix help me!!

    int idkh = int.Parse(Session["CusID"].ToString()); //Chỗ này nè
            if (Session["GioHang"] == null)
            {
                Response.Redirect("~/GioHangRong.aspx");
            }
            int ngay = int.Parse(DateTime.Now.Day.ToString());
            int thang = int.Parse(DateTime.Now.Month.ToString());
            int nam = int.Parse(DateTime.Now.Year.ToString());
     
            string[] dmy = (txtThoiGianGiao.Text).Split('/');
            int dd = int.Parse(dmy[0].ToString());
            int mm = int.Parse(dmy[1].ToString());
            int yy = int.Parse(dmy[2].ToString());
     
     
            string sql1 = "insert into Orders values ('" + idkh + "','" + drlPhuongThucThanhToan.SelectedItem.Value.ToString() + "',N'" + txtTenNguoiNhan.Text + "','" + nam + "/" + thang + "/" + ngay + "','" + yy + "/" + mm + "/" + dd + "',N'" + txtDiaChi.Text + "',0,N'" + txtGhiChu.Text + "','" + txtSDT.Text + "')";
    

    • Khách hàng muốn mua hàng phải đăng nhập, khi đăng nhập thành công thì sẽ tồn tại biến session["CusID"] và chỉ việc lấy ra xài thôi!

      • Phan

        Sau khi đăng nhập thành công,bạn sẽ có Session["name"] này.Vậy làm sao để từ session["name"] này, bạn lấy từ csdl ra để có biến session[CusId].Bạn gợi ý cho mình với nha. please!!!help me

      • Phan

        mình làm được rùi. cảm ơn bạn nhiều lắm hihi

        • Trung

          Bạn chỉ cho mình cách lấy từ CSDL ra để có biến session[CusId].

      • Nhock

        bạn hướng dẫn mình lấy Session["CusID"] được k??

  8. Đỗ Ngọc Tú

    bạn có thể làm phần đăng nhập .Khi đăng nhập thành công xong ghi nhớ tên người sử dụng được không .Khi log out thì không còn tên người sử dụng nữa .

  9. Trần Quyết

    DataTable dt = data.get("Select ProName,Price From Products where ProID=" + idSP).Tables[0];
    String TenSP = dt.Rows[0][0].ToString();
    int Dongia = int.Parse(dt.Rows[0][1].ToString());
    

    Em không hiểu cái chỗ data.get là lấy ở đâu ra mọi người chỉ em với !!
    Ai giải thích luôn em cả đoạn này luôn thì tốt quá !

    Em cảm ơn mọi người !

    • Trần Quyết

      Em sr mọi người em bị lỗi chỗ

      String TenSP = dt.Rows[0][0].ToString();
      int Dongia = int.Parse(dt.Rows[0][1].ToString());
      

      • Dương

        if (Request.QueryString["ProID"] != null)
         {
        int idSP = int.Parse(Request.QueryString["ProID"]);
        DataTable dt = data.get("Select ProName,Price From Products where ProID=" + idSP).Tables[0];
        

        Cho mình hỏi cái request ProID là bạn request từ đâu da để lấy về proid đó vây

      • Tù nút “Mua Hàng” bạn ak! khi nhấn nút mua hàng thì mình sẽ có “ProID” để sử dụng!

    • Le Minh Chau

      data.get là hàm nằm trong class dataProvider đó bạn, hàm này có chức năng lấy dữ liệu từ csdl lên và trả về datatable, bạn xem lại bài kết nối dữ liệu, còn code đó:

           DataTable dt = data.get("Select ProName,Price From Products where ProID=" + idSP).Tables[0];
      

      -đọc câu truy vấn và lấy lên đỗ vào datatable

           String TenSP = dt.Rows[0][0].ToString();
      

      -khai báo biến kiểu chuỗi: gán vào biến bằng giá trị của datatable tại dòng có chỉ số là 0 và lấy ô đầu tiên là 0

           int Dongia = int.Parse(dt.Rows[0][1].ToString());
      

      - tương tự lấy đơn giá ô thứ 2 có chỉ số index là 1.

  10. vtd93

    Hy vọng bạn có thêm bài viết về thanh toán online :)

    • Hii… mình dừng, chắc không viết ASP.Net nữa quá! Dạo này thích WP với mấy thứ linh tinh hơn! không có ngâm cú ASP.Net nữa òi! :D

  11. Le Minh Chau

    Bạn cho mình hỏi về giỏ hàng. Mình bị lỗi ở nút cập nhật trong trang giỏ hàng. khi chạy tới dòng:

        if (int.Parse(gvGioHang.DataKeys[r.DataItemIndex].Value.ToString()) == int.Parse(dr["idSP"].ToString()))
    

    Là nó chạy thẳng xuống dòng catch và báo lỗi. mình k bít lỗi gì. Mong bạn giúp mình sớm, vì mình đang làm đồ án thi, cảm ơn bạn trước

    • Có thể do bạn chưa set DataKey cho gvGioHang, bạn xem trong phần thanh properties của gvGioHang thử đi!

      • hung

        datakey o day dat thuoc tinh cu the la gi ban, minh lam hoai ko dc

        • DataKey là thuộc tính khóa chính của bảng, khai báo ở thanh thanh Property.

  12. Trinh Thi Dung

    Bạn ơi cho mình hỏi chút mình dùng linq và procedure để truy vấn cơ sở dữ liệu, làm thế nào để lấy được mã hóa đơn xuất mà vừa chèn vào vậy. Mình đang rất cần mong bạn giúp.

    • Hii mình không rành về LINQ, bạn có thể tham khảo bài này: truy vấn trong LINQ to SQL

    • chào bạn ! bạn có thể chia sẻ code giỏ hàng viết bằng LinQ được k ban ! thanks
      mail:theanh.cntt90@gmail.com

  13. Le Minh Chau

    protected void ibtCapNha_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                DataTable dt = (DataTable)Session["GioHang"];
                foreach (GridViewRow r in gvGioHang.Rows)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        if (int.Parse(gvGioHang.DataKeys[r.DataItemIndex].Value.ToString()) == int.Parse(dr["idSP"].ToString()))
                        {
                            TextBox t = (TextBox)r.Cells[3].FindControl("txtSoLuong");
                            if (Convert.ToInt32(t.Text) <= 0)
                                dt.Rows.Remove(dr);
                            else
                                dr["SoLuong"] = t.Text;
                            break;
                        }
                    }
                }
                Session["Giohang"] = dt;
                Response.Redirect("~/GioHang.aspx");
            }
            catch (Exception)
            {
                Response.Write("alert('Đã Phát Sinh Lỗi, Vui Lòng Kiểm Tra Lại!...')");
            }
        }
    

    Mình chạy debug thì nó báo tại dòng:

        TextBox t = (TextBox)r.Cells[3].FindControl("txtSoLuong");
    

    biến t|null, không tìm được text số lượng: mình đã Edittempleate cho cột số lượng trên lưới và đặt tên đúng như của bạn. vậy là lỗi gì, mong bạn giúp, cảm ơn bạn!

    • Nếu đã đặt đúng tên, bạn xem lại xem chổ đó phải là Cells[3] hay không đếm từ trái sang bắt đầu từ 0.

  14. Le Minh Chau

    Mình làm giỏ hàng ok oy. cảm ơn bạn nhìu
    Bạn có hướng dẫn phần phân quyền để đăng nhập hem?
    nếu có post lên cho mình và mọi người tham khảo nhé
    cảm ơn bạn

  15. Cuong

    Bạn ơi mình down demo các lớp của bạn khá là hay.Nhưng trong phần này mình không hiểu phần thiết kế trang show_giohang.aspx, bạn thêm cột quantity là số lượng sao bạn lại có thuộc tính Datafile là quantity.Bài của bạn không có cơ sở dữ liệu nên mình hơi khó hiểu cái đấy.Mình đang làm phần giỏ hàng mong bạn gửi cho mình cơ sở dữ liệu của demo trên.Mình đang rất cần mình cảm ơn bạn rất nhiều.Mong bạn đọc được coment này thì bạn gủi vào mail cho mình nhá.Không bạn gửi lên trên đây rất nhiều người cần nó.Mình thay mặt mọi người cảm ơn bạn rất nhiều về bài viết.Thanks

  16. Cuong

    Mail của mình là cuongit91@gmail.com
    cảm ơn bạn rất nhiều.Mong rằng bạn sẽ có nhiều bài thật hay như bài này.

  17. tuyen

    ban oi cho minh hoi lam o tren ban noi khi dang nhap thang cong thi se tao ra 1 session["cusid"].nhung minh co thay cho nao ban tao ra session["cusid"] dau.

  18. Thanh Trúc

    Bạn ơi cho mình hỏi chỗ

    protected void gvGioHang_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "btXoa")//btxoa nay la o dau vay ban
            {
                int chiso = int.Parse(e.CommandArgument.ToString());
                try
                {
                    DataTable dt = (DataTable)Session["GioHang"];
                    dt.Rows.RemoveAt(chiso);
                    Session["GioHang"] = dt;
                    Response.Redirect("GioHang.aspx");
                }
                catch
                {
                    Response.Redirect("GioHang.aspx");
                }
            }
        }
    

  19. Thanh Trúc

    ***và ở phần này mình bị lỗi ko lấy được giá trị textbox nhập vào mình ko thể cập nhật và mỉnh cũng đã xét datakey rùi.

    TextBox t = (TextBox)r.Cells[3].FindControl(“txtSoLuong”);

    ***mình đã debug thử vẫn chạy nhưng khi

    Response.Redirect(“GioHang.aspx”);

    xong thì tự đông nhảy qua catch và ko cập nhật số lượng được. bạn giúp mình nha

  20. Trần trà my

    Bạn ơi cho m` hỏi vs, tại sao bài mình làm nó cứ báo lỗi ở chỗ Load_data(); trong trangchu.aspx m` sửa hoài k có đc. Bạn giúp m` đc k

  21. dot net

    bạn cho mình hỏi sao mình kích vào mua hàng mà nó không có thay đổi gì vậy? mình đã debug nhưng nó cũng ko chạy đến
    Response.Write(“alert(‘Đã thêm vào giỏ hàng ^.*!…’);”);

  22. ten ban

    moi nguoi giup minh voi. sao minh kich vao đặt mua báo thành công vậy mà ở trang GioHang.aspx khong co san pham do. upupuppu

  23. Cổ đại hải

    Cám ơn bạn vì bài viết rất bổ ích và mình cũng làm dc giỏ hàng rồi. nhưng giờ phát sinh thêm một vấn đề là mình muốn thêm một bảng là size sản phẩm(bảng size sản phẩm có masp, masize và size). mình đã xử lý được load size theo sản phẩm rồi nhưng không đưa size vào giỏ hàng hay lưu xuống đơn hàng được. Mong bạn giúp đỡ. thank!

  24. Tuấn Anh

    các anh ơi cho e hổi là ? e đang làm eProject làm trang tin tức ấy ? mình muốn lấy thông tin theo ID thì làm thế nào ạ ? e làm theo mô hình 3 tầng ?ai biết thì giúp e vs ạ

  25. Giang

    Mình bị lỗi dòng int intidSP = int.Parse(dlSanPham.DataKeys[e.Item.ItemIndex].ToString()); bạn chỉ mình với

    • Bạn chọn vào dlSanPham nhìn vào Properties tìm dòng nào datakeyname gõ vào khóa chính của bản Sản Phẩm là xong!

  26. timhieuhochoi

    Mình đang cần bài làm cái phần giỏ hàng bạn có thể cho mình bài demo đó hok. Gửi qua email: vinhquoc52@gmail.com
    Cảm ơn bạn nhé.

  27. ngominhthien

    ban oi cho minh mail hay dt di co gi minh hoi chu minh ga lam.
    thank

  28. thien

    giai thich cho minh cai nay ro hon duoc k:
    string strnumber = tbGioHang.Compute(“Sum(TongTien)”, “”).ToString();

  29. thien

    cho minh hoi nay nua:
    String TenSP = dt.Rows[0][0].ToString();
    int Dongia = int.Parse(dt.Rows[0][1].ToString());
    dt.Rows[0][0] hinh nhu nay la de chua “idsp” trong “tbgiohang” .dongia phai la [0][2],tensp [0][1] coi lai do gium minh di minh ko hieu.

  30. thien

    ah minh co y kien:cot “tongtien” nen doi lai la “thanhtien” cho de hieu

  31. Tien

    Chào bạn . mình bị lỗi ở chổ là Itemcommand name không nhận sự kiện khi click vào , không set session được . mình đặt tên đúng hết . mong bạn giải đáp giúp tại sao button không nhận lệnh

    • Bạn xem lại cách đặt tên và gọi cho đúng tên control.

  32. thien

    Ban giai thick gium minh dong nay o dau truyen wa z : “Request.QueryString["ProID"] != null”
    tra loi minh cau nay thoi may cau kia hieu roi?. Thanks

    • Tức là khi mình chọn vào nút mua hàng thì sẽ truyền ID Sản phẩm vào trong giỏ, ở đây xét nếu ID đó không bằng NULL thì mới xử lý, ngược lại thì thông báo lỗi!

  33. quoc

    Ban oi cho minh hoi cai cho

     if ((int)row["idSP"] == intidSP)
                     {
                         row["SoLuong"] = (int)row["SoLuong"] + 1;
                            goto GioHang;
                   }
    

    Cai goto giohang . no o dau ra vay

    • Ở dưới dòng đó lun đó bạn. Ngoài vòng lặp mình có cái label “Giohang:” đấy.

    • quoc

      ban oi ban co yh k? chi giup cai loi nay voi? chi truc tiep moi hieu duoc.

  34. quoc

    bạn ơi sao chỗ này :
    tbGioHang.Rows.Add(intidSP, strTenSP, flGia, intSoLuong);
    có lỗi này nè:
    Input array is longer than the number of columns in this table.

    Source Error:

    Line 91: }
    Line 92: float tt = giamh * sl;
    Line 93: tbgiohang.Rows.Add(id, tenmh, giamh, sl);
    Line 94: giohang:
    Line 95: Session["giohang"] = tbgiohang;

    bi h làm sao để sửa

  35. thien

    cho minh hoi ki cai nay di no bao loi hoai:
    int chiso = int.Parse(e.CommandArgument.ToString());
    ban giai thik gium cau truc cau do di.chi so do la chi so gi,lay tu table hay griview.voi lai khoa chinh cua minh la string.

  36. htt

    Bạn cho download code mà để lung tung chẳng đâu vào đâu, mình làm chỉ cần 1-2 trang aspx (Tùy phân nhỏ hay gộp lại) là chạy OK. Bạn làm hướng dẫn thì code nên để thành 1 project, cái nào thừa thì bỏ đi để người không biết có thể chạy demo được ngay. Hướng dẫn như bạn thì chỉ có người biết rồi mới hiểu, mà người biết rồi thì họ không dùng code của bạn.

  37. Lê Minh Tuấn

    Mình cũng đã làm theo code nút cập nhật số lượng nhưng nó không cập nhật được, nó vẫn chạy nhưng lại không ra đúng kết quả, mình cũng đã set datakeyname cho gridview nhưng vẫn không được. Mong các bạn giải đáp giúp mình nhé. Thanks nhìu…..

  38. bạn ơi, ở trang hiện thị sản phẩm, trong datalist mình có dùng Label để hiện thị giá : Eval(“Price”, “{0:0,#}”)
    nhưng khi lấy dữ liệu để đưa vào giỏ hàng thì bị lỗi “Input string was not in a correct format”

    p/s : nếu không định dạng mà chỉ đổ dữ liệu bình thường, chỉ có Eval(“Price”) thôi thì vẫn chạy ok.

    Vậy làm cách nào để có thể vừa định dạng đc mà vừa chạy được luôn. :)

  39. Vinhquoc

    Anh ơi, em đang làm cái giỏ hàng, nhưng hok hiểu rõ lắm. Anh có video hướng dẫn kĩ về cái làm giỏ hok, gửi quan mail dùm em với : vinhquoc52@gmail.com.
    Cảm ơn.

    • Mình không có Video bạn ak! Bạn download file Source ở cuối bài về tham khảo thử đi! :D

  40. Vinhquoc

    Hay có 1 bài ví du demo giao diện sẵn chỉ làm giỏ thôi cũng được.

  41. Thanh Hai

    cái link down bị die rồi bạn ơi. Có thể up lại được không bạn

  42. chanchanspam

    Rảnh vào chém gió tí vậy. Có một số góp ý sau.
    - Giỏ hàng có thể lưu trên cookie hoạc sesion(cách bên trên là sesion rồi)
    + Cookie: Ưu điểm nhanh, tiện lợi vì không “kết nối” đến server trong các khâu thêm và cập nhật giỏ hàng Nên có thể thêm mặt hàng liên tục. Chỉ kết nối khi thanh toán. Nhực điểm: Sẽ không chạy nếu trình duyệt tăt javascrit hoạc tắt cookie.
    + sesion: Ưu điểm ổn định không phụ thuộc vào trình duyệt vì xử lý ở trên server mà. Nhược điểm: chậm, không tiện lợi nếu không dùng ajax thì Mỗi lần người dùng chọn một sản phẩm thì phải load lại trang.
    - Code cảu bạn:
    + Nút mua tiếm nên để là link thôi nhé.
    + Làm giỏ hàng thì dùng call_back(không load lại trang dùng ajax, jquery, và cao thủ hơn thì tự code bằng javascrit trước ie mình dùng ActiveXObjext và funcion trên server phải để là từ khóa [WebMethod] lên dòng trước của function) chú không nên dùng post_back(Load lại trang xử lý bình thương)

    @Trung: Lỗi của bạn mình không nhớ chính sác cách sửa nhưng đại loại là khai báo ở trên ban thêm thuộc tính hinh như là AutoEventWireup bằng true để nó gửi sự kiện về server nhé(Những cái như textchanger… bạn cũng cần thuộc tính này)

  43. abcxyz

    link down bi die ùi up lai đc ko bạn ui :(

  44. Của mấy bác đây: https://www.dropbox.com/s/izsiiy14xhjlg76/GioHang.zip SR vì Media bị gì khóa tài khoản mình :(

  45. abcxyz

    DataList1.DataSource = tb;
    DataList1.DataBind();
    s khi chạy hàm load_data nó báo lỗi chỗ datalist1 vậy bạn ui ,
    Lỗi thế này: Both DataSource and DataSourceID are defined on ‘DataListchitiet’. Remove one definition.
    hjx giúp mình với

  46. Nhi

    Mình có thắc mắc là khi thêm vào giỏ hàng thì dữ liệu ở trang chủ làm sao có thể load qua girdview giỏ hàng được , giúp mình với ban ơi :(

    • Lê Minh Tuấn

      Nếu bạn làm theo code trên thì thông tin của sản phẩm ở trang chủ sẽ được lưu vào session và khi qua trang giỏ hàng thì gridview sẽ lấy source từ session đó

  47. Nhân

    DataTable dt = data.get(“Select ProName,Price From Products where ProID=” + idSP).Tables[0];

    Cái data trong data.get là cái gì vậy a

    • Cái này gọi từ lớp kết nối đó bạn, bạn xem lại nha!

  48. hau

    co the chi em nut thanh toan va in ra hoa don = jeqquery

  49. Quân

    bạn ơi mình thắc măc ở chỗ CSDL bảng đơn hàng (OrderDetails) chỉ chứa được ID của 1 mặt hàng.vậy nếu 1 ngày 1 khách đặt nhiều đơn hàng và trong mỗi đơn hàng có nhiều sản phẩm khác nhau thì sẽ ra sao.mong bạn giải thích giúp. :-)

  50. Quân

    à mình hiểu rồi bạn ạ.tks nhé

  51. duy

    string sql = “select PayID,PayName from PayMethod where Visible = 1″;
    drlPhuongThucThanhToan.DataSource = data.get(sql).Tables[0];

    drlPhuongThucThanhToan.DataTextField = “PayName”; ===>drlPhuongThucThanhToan khai bao o cho nao vay ?

    drlPhuongThucThanhToan.DataValueField = “PayID”;
    drlPhuongThucThanhToan.DataBind();

  52. code gà

    bạn ơi nếu trong 1 đơn hàng có nhiều loại sản phầm thì trong code sever sẽ phải xử lí để tạo nhiều đơn hàng phải không.vì trong demo của bạn khi đặt hàng chỉ có 1 loại hàng là quần thôi.nếu tôi muốn đặt thêm áo trong đơn hàng đấy thì sẽ sao ? có phải tạo ra 2 đơn hàng đúng ko bạn

  53. Nhi

    protected void gvGioHang_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
    System.Windows.Forms.DialogResult kq = System.Windows.Forms.MessageBox.Show(“Ban co muon xoa SP nay?”, “Thong Bao”, System.Windows.Forms.MessageBoxButtons.YesNo);// dong nay nek

    if (kq == System.Windows.Forms.DialogResult.Yes)
    {
    tbGioHang.Rows.RemoveAt(e.RowIndex);
    gvGioHang.EditIndex = -1;
    load_data();
    }
    }
    trong demo load về ,mình ko hiểu chỗ System.Window đó , bạn có chú thích là của thư viện Windows Form nhưng nó nằm đâu za bạn hay mình fai code :( mong bạn giải thích giúp mình , mình cảm ơn :(

    • Nhựt

      thư viện có thi sai. quan tam lam gi!. cua visual có sẵn mà !

  54. Nhựt

    hay lắm!.

  55. Nhựt

    Những bài viết của bạn hay lắm!. mong bạn post nhiều như zậy nửa. đặt biệt là về asp.net.

  56. ngoc anh

    các bạn có bài hoàn chỉnh của bài này không? cho mình xin về tham khảo ! mình cũng mới tập tành asp nên cũng khó hình dung hơi gà? các bạn up link hay gởi qua mail nhé mình cảm ơn

  57. Vương

    Anh ơi cho em hỏi! Em muốn xuất tổng của các dòng trong cột số lượng trong bảng Giỏ hàng thì em phải làm sao? Cảm ơn anh!

  58. Khương

    Anh ơi cho em hỏi, trong Demo co 2 thư mục Giohang va giohang2.
    Cái nào sử dụng được vây?

Để lại comment của bạn