2012-09-28 23 views
5

tôi có mã sau đây trong đơn đăng ký của mình. Nhưng sự kiện Listchanged không được kích hoạt như mong đợi. Tôi có một đối tượng "Đặt chỗ". Tôi đang gọi nó từ frmMain. Bạn vui lòng cho tôi biết vấn đề không ??BindingList <> Sự kiện đã thay đổi không được kích hoạt

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.OleDb; 
using System.ComponentModel; 

namespace CustomObjects 
{ 
public class Booking:ObjectBase 
{ 

    private int pBookingNo=0; 
    private BindingList<Loans> pCashLoans = new BindingList<Loans>(); 

    public int BookingNo 
    { 
     get { return pBookingNo; } 
     set 
     { 
      if (!value.Equals(pBookingNo)) 
      { 
       pBookingNo = value; 
       PropertyHasChanged("BookingNo"); 
      } 
     } 
    } 

    public BindingList<Loans> CashLoans 
    { 
     get { return pCashLoans; } 
     set 
     { 
      pCashLoans = value; 
      //CalculateCashLoan(this,new System.ComponentModel.ListChangedEventArgs(ListChangedType.Reset,-1)); 
      PropertyHasChanged("CashLoans"); 
     } 
    } 

    private decimal pTakenCashLoan = 0; 
    public decimal TakenCashLoan 
    { 
     get { return pTakenCashLoan; } 
     set 
     { 
      pTakenCashLoan = value; 
      PropertyHasChanged("TakenCashLoan"); 
     } 
    } 

     public void CalculateCashLoan(object sender, ListChangedEventArgs args) 
    { 
     decimal total = 0; 
     foreach (Loans loan in pCashLoans) 
     { 
      total += loan.LoanAmount; 
     } 
     this.TakenCashLoan = total; 
    } 

    public Booking() 
    { 
     this.pCashLoans.ListChanged += this.CalculateCashLoan; 
    } 


    public static Booking FillEntity(OleDbDataReader Reader, OleDbConnection Connection) 
    { 
     Booking booking = new Booking(); 
     booking.BookingNo = (int)Reader["BookingNo"]; 

     booking.CashLoans = Loans.GetLoanList(booking.BookingNo, 1, Connection); 
     booking.MarkOld(); 
     return booking; 
    } 

    public static Booking GetEntity(int bookingNo, string ConnectionString) 
    { 
     Booking booking =new Booking(); 
     using (OleDbConnection Connection = new OleDbConnection(ConnectionString)) 
     { 
      string sqlSelect = "SELECT BookingNo FROM tblBooking WHERE BookingNo=" + bookingNo + ""; 
      using (OleDbCommand cmd = new OleDbCommand(sqlSelect, Connection)) 
      { 
       Connection.Open(); 
       OleDbDataReader bReader = cmd.ExecuteReader(); 
       if (bReader.HasRows) 
       { 
        bReader.Read(); 
        booking = FillEntity(bReader, Connection); 
       } 
       Connection.Close(); 

       if (!bReader.IsClosed) 
       { 
        bReader.Close(); 
       } 
      } 
     } 
     return booking; 
    } 

} 

} 

tôi kêu gọi mã này từ đây

private void frmMain_Load(object sender, EventArgs e) 
    { 
     AddDataBindings(); 
     cmbBookingType.DataSource = BookingType.GetSelectionList(ConnectionString.CreateConnectionStringForAccess("LOCAL", "2012")); 
    } 

    private Booking booking=new Booking(); 
    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      booking = Booking.GetEntity(1, ConnectionString.CreateConnectionStringForAccess("LOCAL", "2012")); 
      bsBooking.DataSource = booking; 
     } 
     catch (Exception Ex) 
     { 
      MessageBox.Show(Ex.Message); 
      MessageBox.Show(Ex.StackTrace); 
     } 
    } 

Trả lời

4

Đó là bởi vì bạn đang gán một BindingList dụ mới vào thuộc tính thay vì thêm và loại bỏ các mục vào danh sách hiện có.

Hãy thử đặt thuộc tính CashLoans chỉ đọc, ví dụ: xóa bộ truy cập đã đặt và sửa đổi mã để xóa danh sách và thêm các mục mới.

+0

Kính gửi Malio, cảm ơn nhiều bạn. Tôi đã có đầu mối và xác định lại mã như sau: công BindingList CashLoans { nhận được { return pCashLoans; } đặt { foreach (Cho vay có giá trị) { pCashLoans.Thêm (khoản vay); } } } Và nó hoạt động tốt như mong đợi. –

Các vấn đề liên quan