2012-09-28 21 views
5

tengo el siguiente código en mi aplicación. Pero el evento Listchanged no se activa como se esperaba. Tengo un objeto "Reserva". Estoy llamando esto desde frmMain. ¿Podría decirme el problema?BindingList <> evento Listchanged no activado

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

} 

} 

que llamo el código de aquí

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

Respuesta

4

Es porque va a asignar un nuevo BindingList instancia a la propiedad en lugar de agregar y quitar elementos a la lista existente.

Intente hacer que la propiedad CashLoans sea de solo lectura, es decir, elimine el acceso del conjunto y modifique el código para borrar la lista y agregar los nuevos elementos.

+0

Querido Malio, muchas muchas gracias maaaaaaany. Tengo la pista y redefiní el código de la siguiente manera: public BindingList CashLoans { get { return pCashLoans; } conjunto { foreach (Préstamo de valor) { pCashLoans.Add (loan); } } } Y su funcionamiento es excelente. –

Cuestiones relacionadas