有没有人知道,怎么在Dictionary 或者arraylist的元素变化时就触发某个事件。。有没有方法实现的!?请指教

解决方案 »

  1.   

    尝试以下这个接口INotifyPropertyChanged,MSDN的原始代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.Common;
    using System.Diagnostics;
    using System.Drawing;
    using System.Data.SqlClient;
    using System.Windows.Forms;// This form demonstrates using a BindingSource to bind
    // a list to a DataGridView control. The list does not
    // raise change notifications, however the DemoCustomer type 
    // in the list does.
    public class Form1 : System.Windows.Forms.Form
    {
    // This button causes the value of a list element to be changed.
    private Button changeItemBtn = new Button(); // This is the DataGridView control that displays the contents 
    // of the list.
    private DataGridView customersDataGridView = new DataGridView(); // This is the BindingSource used to bind the list to the 
    // DataGridView control.
    private BindingSource customersBindingSource = new BindingSource(); public Form1()
    {
    // Set up the "Change Item" button.
    this.changeItemBtn.Text = "Change Item";
    this.changeItemBtn.Dock = DockStyle.Bottom;
    this.changeItemBtn.Click +=
    new EventHandler(changeItemBtn_Click);
    this.Controls.Add(this.changeItemBtn); // Set up the DataGridView.
    customersDataGridView.Dock = DockStyle.Top;
    this.Controls.Add(customersDataGridView);
    this.Size = new Size(800, 200);
    this.Load += new EventHandler(Form1_Load);
    } private void Form1_Load(System.Object sender, System.EventArgs e)
    {
    // Create and populate the list of DemoCustomer objects
    // which will supply data to the DataGridView.
    List<DemoCustomer> customerList = new List<DemoCustomer>();
    customerList.Add(DemoCustomer.CreateNewCustomer());
    customerList.Add(DemoCustomer.CreateNewCustomer());
    customerList.Add(DemoCustomer.CreateNewCustomer()); // Bind the list to the BindingSource.
    this.customersBindingSource.DataSource = customerList; // Attach the BindingSource to the DataGridView.
    this.customersDataGridView.DataSource =
    this.customersBindingSource;
    } // This event handler changes the value of the CompanyName
    // property for the first item in the list.
    void changeItemBtn_Click(object sender, EventArgs e)
    {
    // Get a reference to the list from the BindingSource.
    List<DemoCustomer> customerList =
    this.customersBindingSource.DataSource as List<DemoCustomer>; // Change the value of the CompanyName property for the 
    // first item in the list.
    customerList[0].CompanyName = "Tailspin Toys"; } [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.Run(new Form1());
    }
    }// This class implements a simple customer type 
    // that implements the IPropertyChange interface.
    public class DemoCustomer : INotifyPropertyChanged
    {
    // These fields hold the values for the public properties.
    private Guid idValue = Guid.NewGuid();
    private string customerName = String.Empty;
    private string companyNameValue = String.Empty;
    private string phoneNumberValue = String.Empty; public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
    if (PropertyChanged != null)
    {
    PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
    } // The constructor is private to enforce the factory pattern.
    private DemoCustomer()
    {
    customerName = "no data";
    companyNameValue = "no data";
    phoneNumberValue = "no data";
    } // This is the public factory method.
    public static DemoCustomer CreateNewCustomer()
    {
    return new DemoCustomer();
    } // This property represents an ID, suitable
    // for use as a primary key in a database.
    public Guid ID
    {
    get
    {
    return this.idValue;
    }
    } public string CompanyName
    {
    get
    {
    return this.companyNameValue;
    } set
    {
                if (value != this.companyNameValue)
                {
                    this.companyNameValue = value;
                    NotifyPropertyChanged("CompanyName");
                }
    }
    } public string PhoneNumber
    {
    get
    {
    return this.phoneNumberValue;
    } set
    {
                if (value != this.phoneNumberValue)
                {
                    this.phoneNumberValue = value;
                    NotifyPropertyChanged("PhoneNumber");
                }
    }
    }
    }
      

  2.   

    FileSystemWatcher
    判断参考
      

  3.   

    如果你一定要用这2个类的话,应该是没有办法的。
    如果你继承这2个类,自己实现Add,Remove,this[index],this[key]的话就没问题了。
      

  4.   

    对,只有通过继承来实现,其它方法都不可行,特别是wuyq11说的FileSystemWatcher,完全是牛头不对马嘴,不相干的两码事。