2012-09-28 12 views
5

私のアプリケーションには次のコードがあります。しかしListchangedイベントは期待どおりに起動されません。私はオブジェクト "予約"を持っています。私はfrmMainからこれを呼んでいます。問題を教えてくれませんか?BindingList <> 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; 
    } 

} 

} 

私はここ

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

答えて

4

あなたはプロパティに新しいBindingListインスタンスを割り当てる代わりに、既存のリストに項目を追加および削除されているためですから、このコードを呼び出すしています。

プロパティをCashLoansにするだけです。つまり、設定されたアクセサを削除し、コードを修正してリストをクリアして新しいアイテムを追加します。

+0

親愛なるマリオ、多くの多くのmaaaaaaanyありがとうございます。私はヒントを得て、コードを次のように再定義しました。 public BindingList CashLoans { get { return pCashLoans; }は {foreachの(値のローンローン) {pCashLoans.Add(ローン)を設定します。 } } } 期待通りに動作します。 –

関連する問題