2012-09-28 11 views
5

Ho il seguente codice nella mia domanda. Ma l'evento Listchanged non viene licenziato come previsto. Ho un oggetto "Booking". Lo chiamo da frmMain. Vorresti dirmi il problema ??BindingList <> Non è stato attivato l'evento listchanged

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

} 

} 

io chiamo questo codice da qui

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

risposta

4

È perché si sta assegnando un nuovo BindingList istanza alla proprietà, invece di aggiungere e rimuovere elementi all'elenco esistente.

Provare a rendere la proprietà CashLoans di sola lettura, ad esempio rimuovere il set accessor e modificare il codice per cancellare l'elenco e aggiungere i nuovi elementi.

+0

Caro Malio, molti molti maaaaaaany grazie. Ho trovato l'indizio e ho ridefinito il codice come segue: BindingList pubblico CashLoans { get { return pCashLoans; } set { foreach (prestito in valore) { pCashLoans.Add (prestito); } } } E funziona perfettamente come previsto. –

Problemi correlati