BindingList<>的ListChanged事件未触发

6
我在我的应用程序中有以下代码。但是Listchanged事件没有按预期触发。我有一个对象"Booking"。我正在从frmMain调用它。您能告诉我问题出在哪里吗?
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);
        }
    }
1个回答

4

这是因为您将一个新的BindingList实例分配给属性,而不是向现有列表添加和删除项目。

尝试将属性CashLoans设置为只读,即删除set访问器并修改代码以清除列表并添加新项目。


亲爱的Malio,非常非常感谢。我已经得到了线索,并重新定义了代码如下: public BindingList<Loan> CashLoans { get { return pCashLoans; } set { foreach (Loan loan in value) { pCashLoans.Add(loan); } } }它的表现非常出色,符合预期。 - s.k.paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接