Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 16 kết quả

Đề tài: Gọi đến 1 method trong class nhưng lỗi "Object reference not set to an instance of an object."

  1. #1
    Ngày gia nhập
    11 2011
    Bài viết
    11

    Mặc định Gọi đến 1 method trong class nhưng lỗi "Object reference not set to an instance of an object."

    Mình đang thiết kế trang bán hàng và có phần giỏ hàng (shopping cart).
    Mình dùng 1 file class để tập trung phần xử lý trong đó, tạm gọi là GioHang.cs (đặt trong App_Code)
    Trong class này mình tạo 1 method để xử lý thêm sản phẩm vào giỏ:
    Code:
    public DataTable addSanPham2GioHang(int MaSP, string TenSP, double DonGia, string HinhAnh)
        {
            if (gio.Rows.Count != 0)
            {
                foreach (DataRow row in gio.Rows)
                {
                    if (row["MaSP"].ToString().Equals(MaSP.ToString()))
                    {
                        row["SoLuong"] = int.Parse(row["SoLuong"].ToString()) + 1;
                        row["ThanhTien"] = int.Parse(row["SoLuong"].ToString()) * DonGia;
                        return gio;
                    }
                }
            }
            DataRow newrow = gio.NewRow();
            newrow[0] = HinhAnh;
            newrow[1] = MaSP;
            newrow[2] = TenSP;
            newrow[3] = 1;
            newrow[4] = DonGia;
            newrow[5] = DonGia;
            gio.Rows.Add(newrow);
            return gio;
        }
    Và tại trang Sản phẩm (datalist) mình dùng Datalist_ItemCommand để bắt các thông số cần để gọi đến method addsanpham trong class GioHang.cs
    Code:
    DataListItem item1 = e.Item;
                    int MaSP = int.Parse((item1.FindControl("MaSPLabel") as Label).Text);
                    string TenSP = (item1.FindControl("TenSPLabel") as Label).Text;
                    double DonGia = double.Parse((item1.FindControl("DonGiaLabel") as Label).Text);
                    string HinhAnh = item1.FindControl("imgHinhAnh").ToString();
                    gh.addSanPham2GioHang(MaSP, TenSP, DonGia, HinhAnh);
                    break;
    Nhưng khi chạy trang sản phẩm bấm nút add to cart thì bị lỗi Object reference not set to an instance of an object.
    và báo lỗi tại dòng gh.addSanPham2GioHang(MaSP, TenSP, DonGia, HinhAnh);

    Mình hiểu sơ sơ là do tham số truyền vào không đủ nên không chạy được, nhưng đã kiểm tra đi kiểm tra lại thì đều thấy đầy đủ và chính xác cả.

    Mong các bạn giúp đỡ để hoàn thành đúng thời hạn.
    Mình không biết post những dòng code nào lên cho mấy bạn kiểm tra, nên nếu bạn nào cần xem code khác xin reply mình sẽ post lên nhờ các bạn xem giúp.

  2. #2
    Ngày gia nhập
    05 2011
    Bài viết
    299

    cái lỗi này rất nhức đầu ^^
    mà bạn đã khởi tạo đối tương gh chưa?
    gh.addSanPham2GioHang(MaSP, TenSP, DonGia, HinhAnh);
    GioHang gh = new GioHang(); ?????
    Programming tutorials and source code examples

    Trong nhà không vợ không con
    Uống bia gặm thịt sao ngon thế này
    Nhậu nhẹt không bị la rầy
    Một tuần ta cứ bảy ngày " nâng ly "....

  3. #3
    Ngày gia nhập
    11 2011
    Bài viết
    11

    Trích dẫn Nguyên bản được gửi bởi rossoneri Xem bài viết
    cái lỗi này rất nhức đầu ^^
    mà bạn đã khởi tạo đối tương gh chưa?

    GioHang gh = new GioHang(); ?????
    Trời, nhờ gợi ý của bạn mình đã fix được rồi hihi
    Lúc làm mình sơ ý chỉ khởi tạo GioHang = gh; sửa lại như bạn gợi ý đã chạy được rùi.

    ============

    Nhưng mà mình bị trục trặc thêm ở phần cart, là add sản phẩm nào vào cart thì cart chỉ hiển thị 1 sản phẩm mới add, chứ không add thêm vào.
    Add 2 lần 1 sản phẩm giống nhau thì cũng chỉ ra số lượng 1, chứ không cộng vào.
    Tại button add to cart mình có sự kiện setGioHang2Session:
    Code:
    protected void setGioHang2Session(GioHang gh)
        {
            Session["GioHang"] = gh;
        }
    Và tại trang ViewCart.aspx mình có hàm getGioHangFromSession:
    Code:
    protected GioHang getGioHangFromSession()
        {
            if (Session["GioHang"] == null)
            {
                return new GioHang();
            }
            else return (Session["GioHang"] as GioHang);
        }
    Và Page_Load trang ViewCart.aspx mình để gh = getGioHangFromSession();
    Mong bạn xem giúp mình lần nữa.
    Đã được chỉnh sửa lần cuối bởi phudq90 : 03-03-2012 lúc 05:42 PM.

  4. #4
    Ngày gia nhập
    05 2011
    Bài viết
    299

    code thì mình chịu, mình chỉ gợi ý thui
    1. nếu chỉ muốn hiển thị thì ở chỉnh ở button đừng gọi hàm lưu nữa
    2. kiểm tra trong database xem nó tồn tại chưa, tồn tại thì lấy ra hiển thị, k lưu
    Programming tutorials and source code examples

    Trong nhà không vợ không con
    Uống bia gặm thịt sao ngon thế này
    Nhậu nhẹt không bị la rầy
    Một tuần ta cứ bảy ngày " nâng ly "....

  5. #5
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Bạn cần show lên đoạn code các Field của class . Để xem các field trong class bạn tổ chức ra sao đã

    Chứ ko biết bạn tổ chức class ra làm sao thì cũng khó mà xem cho bạn được

    Bạn nên đặt 1 cái breakpoint vào vị trí : row["SoLuong"] = int.Parse(row["SoLuong"].ToString()) + 1;
    Khi thực hiện debug, thử trường hợp add vào 2 sản phẩm cùng loại rồi Run xem nó có nhảy vào vị trí của breakpoint đó không.
    Nếu nhảy vào thì cho tiếp tục Step out tiếp để kiểm tra các Local var(ở window Local) coi có chính xác không không.
    Nếu không nhảy vào thì xem ở window Local giá trị các đầu vào có chuẩn xác không. <-- Nếu không chính xác thì ra ngoài chỗ gọi hàm Add đó, xem các tham số lấy ở đâu ra
    Từ đó để biết chỗ sai nằm ở đâu và ta khắc phục

    Nhiều khi trong cái array row . Bạn cứ đổi số từ int sang string rồi string về int nhắm mắt nhắm mũi mà cuối cùng ko biết nó là cái gì để thực hiện +1 và *dongia cho phù hợp.
    Vậy cần xem lại nếu nó là int rồi thì chỉ việc +1 là xong. Nếu là string : thì đổi sang int , thực hiện + 1 rồi covert cái đống đó thành string lại, gán vào lại cho nó. Mới đúng

    Bạn cần debug cái chỗ đó xem thực hư chuyện tính toán + 1 vào số lượng thì nó có thực hiện đúng như mong muốn không.
    Đã được chỉnh sửa lần cuối bởi clchicken : 03-03-2012 lúc 07:21 PM.
    Um Mani Padme Hum...!!

  6. #6
    Ngày gia nhập
    11 2011
    Bài viết
    11

    Mặc định Gọi đến 1 method trong class nhưng lỗi "Object reference not set to an instance of an object."

    Đây là toàn bộ class GioHang.cs của mình:
    Visual C# Code:
    1. public class GioHang
    2. {
    3.     DataTable gio = new DataTable();
    4.  
    5.     public GioHang()
    6.     {
    7.         gio.Columns.Add("HinhAnh");
    8.         gio.Columns.Add("MaSP");
    9.         gio.Columns.Add("TenSP");
    10.         gio.Columns.Add("SoLuong");
    11.         gio.Columns.Add("DonGia");
    12.         gio.Columns.Add("ThanhTien");
    13.     }
    14.  
    15.     public DataTable getGioHang()
    16.     {
    17.         return gio;
    18.     }
    19.  
    20.     public DataTable addSanPham2GioHang(int MaSP, string TenSP, double DonGia, string HinhAnh)
    21.     {
    22.         if (gio.Rows.Count != 0)
    23.         {
    24.             foreach (DataRow row in gio.Rows)
    25.             {
    26.                 if (row["MaSP"].ToString().Equals(MaSP.ToString()))
    27.                 {
    28.                     row["SoLuong"] = int.Parse(row["SoLuong"].ToString()) + 1;
    29.                     row["ThanhTien"] = int.Parse(row["SoLuong"].ToString()) * DonGia;
    30.                     return gio;
    31.                 }
    32.             }
    33.         }
    34.         DataRow newrow = gio.NewRow();
    35.         newrow[0] = HinhAnh;
    36.         newrow[1] = MaSP;
    37.         newrow[2] = TenSP;
    38.         newrow[3] = 1;
    39.         newrow[4] = DonGia;
    40.         newrow[5] = DonGia;
    41.         gio.Rows.Add(newrow);
    42.         return gio;
    43.     }
    44.  
    45.     public DataTable updateSoLuongGioHang(int MaSP, int SoLuong)
    46.     {
    47.         foreach (DataRow row in gio.Rows)
    48.         {
    49.             if (row["MaSP"].ToString().Equals(MaSP.ToString()))
    50.             {
    51.                 row["SoLuong"] = SoLuong;
    52.                 row["ThanhTien"] = double.Parse(row["DonGia"].ToString()) * SoLuong;
    53.                 return gio;
    54.             }
    55.         }
    56.         return gio;
    57.     }
    58.  
    59.    
    60.  
    61.     public DataTable deleteSanPhamTrongGioHang(int MaSP)
    62.     {
    63.         foreach (DataRow row in gio.Rows)
    64.         {
    65.             if (row["MaSP"].ToString().Equals(MaSP.ToString()))
    66.             {
    67.                 gio.Rows.Remove(row);
    68.                 return gio;
    69.             }
    70.         }
    71.         return gio;
    72.     }
    73.  
    74.     public double TongTien()
    75.     {
    76.         double Total = 0;
    77.         foreach (DataRow row in gio.Rows)
    78.         {
    79.             Total += double.Parse(row["ThanhTien"].ToString());
    80.         }
    81.         return Total;
    82.     }
    83.  
    84. }

    Còn đây là codebehind của trang ViewCart.aspx:
    Visual C# Code:
    1. public partial class ViewCart : System.Web.UI.Page
    2. {
    3.     GioHang gh;
    4.  
    5.     protected void Page_Load(object sender, EventArgs e)
    6.     {
    7.         gh = getGioHangFromSession();
    8.         if (!IsPostBack)
    9.         {
    10.             refresh_gvGioHang();
    11.         }
    12.     }
    13.  
    14.     protected void refresh_gvGioHang()
    15.     {
    16.         gvGioHang.DataSource = gh.getGioHang();
    17.         gvGioHang.DataKeyNames = new string[] { "MaSP" };
    18.         gvGioHang.Columns[5].FooterText = gh.TongTien().ToString("#,## VNĐ");
    19.         gvGioHang.DataBind();
    20.     }
    21.  
    22.     protected GioHang getGioHangFromSession()
    23.     {
    24.         if (Session["GioHang"] == null)
    25.         {
    26.             return new GioHang();
    27.         }
    28.         else return (Session["GioHang"] as GioHang);
    29.     }
    30.  
    31.     protected void setGioHang2Session(GioHang gh)
    32.     {
    33.         Session["GioHang"] = gh;
    34.     }
    35.  
    36.    
    37.     protected void gvGioHang_RowEditing(object sender, GridViewEditEventArgs e)
    38.     {
    39.         gvGioHang.EditIndex = e.NewEditIndex;
    40.         refresh_gvGioHang();
    41.     }
    42.     protected void gvGioHang_RowUpdating(object sender, GridViewUpdateEventArgs e)
    43.     {
    44.         GridViewRow row = gvGioHang.Rows[e.RowIndex];
    45.         int Ma = int.Parse((gvGioHang.DataKeys[0].Value).ToString());
    46.         int SoLuong = int.Parse((row.Cells[4].Controls[0] as TextBox).Text);
    47.         DataTable dt = gh.updateSoLuongGioHang(Ma, SoLuong);
    48.  
    49.         gvGioHang.EditIndex = -1;
    50.         refresh_gvGioHang();
    51.         setGioHang2Session(gh);
    52.     }
    53.     protected void gvGioHang_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    54.     {
    55.         gvGioHang.EditIndex = -1;
    56.         refresh_gvGioHang();
    57.     }
    58.     protected void gvGioHang_RowDeleting(object sender, GridViewDeleteEventArgs e)
    59.     {
    60.         int Ma = int.Parse((gvGioHang.DataKeys[0].Value).ToString());
    61.         DataTable dt = gh.deleteSanPhamTrongGioHang(Ma);
    62.         refresh_gvGioHang();
    63.         setGioHang2Session(gh);
    64.     }
    65. }

    Còn đây là codebehind trang ProductDetails.aspx:
    Visual C# Code:
    1. public partial class ProductDetails : System.Web.UI.Page
    2. {
    3.     GioHang gh = new GioHang();
    4.  
    5.     protected void Page_Load(object sender, EventArgs e)
    6.     {
    7.        
    8.     }
    9.     protected void dlSanPham_ItemCommand(object source, DataListCommandEventArgs e)
    10.     {
    11.         switch (e.CommandName)
    12.         {
    13.             case "Add":
    14.                 DataListItem item1 = e.Item;
    15.                 int MaSP = int.Parse((item1.FindControl("MaSPLabel") as Label).Text);
    16.                 string TenSP = (item1.FindControl("TenSPLabel") as Label).Text;
    17.                 double DonGia = double.Parse((item1.FindControl("DonGiaLabel") as Label).Text);
    18.                 string HinhAnh = ((item1.FindControl("imgHinhAnh") as Image).ImageUrl.Replace("~/images/sp/", ""));
    19.                 gh.addSanPham2GioHang(MaSP, TenSP, DonGia, HinhAnh);
    20.                 setGioHang2Session(gh);
    21.                 Response.Redirect("ViewCart.aspx");
    22.                 break;
    23.         }
    24.     }
    25.  
    26.     protected void setGioHang2Session(GioHang gh)
    27.     {
    28.         Session["GioHang"] = gh;
    29.     }
    30. }
    Đã được chỉnh sửa lần cuối bởi phudq90 : 03-03-2012 lúc 10:09 PM.

  7. #7
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Trời đất.
    Có bảo bạn show luôn cả đống như vậy đâu, đọc vào nhức mắt quá. Show cái cần show thôi chứ.
    Đã lo sợ rằng bạn show cả đống vậy, cố gắng nói rõ rồi mà vẫn vậy. Vẫn show 1 đống.
    __
    Thôi đọc những dòng tiếp theo trong bài của mình đi.
    Lần sau khi đọc xong bài và muốn report : thì cố gắng report luôn toàn bộ vấn đề mà đã đã tiếp nhận. Chứ chỉ report 1 vấn đề thì người khác lại phải mất công "Thế còn những điều khác bạn làm chưa ? " Rất phiền
    __
    Đề nghị bỏ code vào tag [code=c#] , chỉ [code] ko thì nó đen thui thui đọc mệt
    Um Mani Padme Hum...!!

  8. #8
    Ngày gia nhập
    11 2011
    Bài viết
    11

    Sorry mình không biết là có code=c# nên không cho vào, đã fix lại.
    Cái này thực ra mình thực hành lại theo bài của thầy dạy mình, ban đầu thì cả mớ này đều nằm trên 1 trang + 1 class, và chạy thì ok không có lỗi gì cả.
    Mình tách ra 2 pages thì hơi bị rối xíu chỗ đó :(

    Mình đã test debug theo cách của bạn, nhưng nó ko vào breakpoint đó, chạy ra ngoài thì giá trị cũng ok hết.
    Đoạn +SoLuong cũng ko có vấn đề gì cả. Mình edit row đó rồi thay đổi số lượng thì gridview trả lại kết quả đúng ko lỗi, chỉ có lúc add 2 sản phẩm thì ko được.

  9. #9
    Ngày gia nhập
    12 2009
    Nơi ở
    bế quan tu lại
    Bài viết
    846

    hjc, mình gà quá, dịch cái hàm addSanPham2GioHang không được. Bạn dịch dùm mình được không >"<

  10. #10
    Ngày gia nhập
    11 2011
    Bài viết
    11

    Trích dẫn Nguyên bản được gửi bởi aydada Xem bài viết
    hjc, mình gà quá, dịch cái hàm addSanPham2GioHang không được. Bạn dịch dùm mình được không >"<
    Hic, bạn cứ giỡn mình...
    Thì mình chỉ dò trong datable Gio xem đã tồn tại MaSP giống MaSP truyền vào không,
    nếu đã có rồi thì SoLuong+1 và tính lại ThanhTien.
    nếu chưa có MaSP đó thì khởi tạo row mới.

Các đề tài tương tự

  1. Trả lời: 73
    Bài viết cuối: 25-03-2018, 11:45 PM
  2. Giải quyết lỗi "Object reference not set to an instance of an object." này thế nào?
    Gửi bởi saeth trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 08-11-2013, 07:12 PM
  3. Trả lời: 9
    Bài viết cuối: 26-10-2013, 10:27 PM
  4. Lỗi "Object reference not set to an instance of an object" khi sử dụng Session hay Application ?
    Gửi bởi tientan trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 4
    Bài viết cuối: 17-06-2011, 12:08 AM
  5. Lỗi "Object reference not set to an instance of an object" khi update list view?
    Gửi bởi longcoolie trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 27-04-2011, 11:58 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn