2012-09-28 14 views
5

Uygulamamda aşağıdaki kodu kullanıyorum. Ancak Listchanged olayı beklendiği gibi tetiklenmez. Bir objem var "Rezervasyon". Bunu frmMain'den arıyorum. Lütfen bana problemi söyler misin?BindingList <> Listchanged olayı tetiklenmedi

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; 
    } 

} 

} 

Ben bunun yerine eklenmesi ve mevcut listeye öğeleri kaldırma özelliğine yeni BindingList örneğini atamayacaksanız da ondan burada

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); 
     } 
    } 

cevap

4

gelen bu kodu arıyorum.

Yalnızca CashLoans özelliğini kullanmayı deneyin, yani set erişimcisini kaldırın ve listeyi temizlemek ve yeni öğeleri eklemek için kodu değiştirin.

+0

Sevgili Malio, birçok maaaaaaany teşekkürler. aşağıdaki gibi ben ipucu ve kod yeniden tanımlamıştır: kamu BindingList CashLoans { olsun { dönüş pCashLoans; } set { foreach (Değer kredisi) { pCashLoans.Add (kredi); } } } } Ve beklendiği gibi çalışıyor. –

İlgili konular