2012-03-17 50 views
0

以下兩個做工精細:爲什麼我不能分配一個委託變量來註冊一個事件處理程序?

BindingList<Employee> lstEmployees = new BindingList<Employee>(); 

    //delegate pointing to an anonymous method 
    //---------------------------------------- 
    delegate void ListChanged(object lst, ListChangedEventArgs args); 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     listBox1.ValueMember = "Empno"; 
     listBox1.DisplayMember = "Ename"; 
     listBox1.DataSource = lstEmployees; 

     ListChanged lstchanged = delegate(object lst, ListChangedEventArgs args) 
     { 
      lblEmpCount.Text = lstEmployees.Count.ToString(); 
     }; 

     lstEmployees.ListChanged += new ListChangedEventHandler(lstchanged); 
    } 

    //Anonymous method (with params) 
    //----------------------------------------------------- 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     listBox1.ValueMember = "Empno"; 
     listBox1.DisplayMember = "Ename"; 
     listBox1.DataSource = lstEmployees; 

     lstEmployees.ListChanged += delegate(object lst, ListChangedEventArgs args) 
     { 
      lblEmpCount.Text = lstEmployees.Count.ToString(); 
     }; 
    } 

但不是以下:

delegate void ListChanged(object lst, ListChangedEventArgs args); 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     listBox1.ValueMember = "Empno"; 
     listBox1.DisplayMember = "Ename"; 
     listBox1.DataSource = lstEmployees; 

     ListChanged lstchanged = delegate(object lst, ListChangedEventArgs args) 
     { 
      lblEmpCount.Text = lstEmployees.Count.ToString(); 
     }; 

     lstEmployees.ListChanged += lstchanged; //error here 
    } 

如果我可以直接給一個匿名方法(這是一個代表),爲什麼不委託變量?我只是想了解所有這三種方法之間的區別,以及爲什麼我不能寫出第三種方法。

回答

0

你並不需要定義此委託:

delegate void ListChanged(object lst, ListChangedEventArgs args); 

你可以簡單地從System.ComponentModel namesapce使用已定義的委託(ListChangedEventHandler):

ListChangedEventHandler lstchanged = delegate(object lst, ListChangedEventArgs args) 
{ 
    lblEmpCount.Text = lstEmployees.Count.ToString(); 
}; 

lstEmployees.ListChanged += lstchanged; // no error 

ListChanged事件是ListChangedEventHandler類型。所以你不能指望它接受另一種類型的事件處理程序。下面一行是錯誤的,因爲在您的代碼中,lstchanged是您自己的代理類型(ListChanged),而它必須是我的類型ListChangedEventHandler

lstEmployees.ListChanged += lstchanged; //error here 

欲瞭解更多信息,請閱讀this article

相關問題