2014-10-07 91 views
1

我是C#初學者,並下載了擴展方法How do I make a DataGridView immediately commit edits?該方法效果很好,但不理解語法。附加擴展方法的語法

我的問題是要求解釋兩行的語法。
第一行:gv.CurrentCellDirtyStateChanged += (sender, args) =>什麼是+==>對於???
第二行:};爲什麼在這裏需要分號?

public static void ChangeEditModeToOnPropertyChanged(this DataGridView gv) 
    { 
     gv.CurrentCellDirtyStateChanged += (sender, args) => 
     { 
      gv.CommitEdit(DataGridViewDataErrorContexts.Commit); 
      if (gv.CurrentCell == null) 
       return; 
      if (gv.CurrentCell.EditType != typeof(DataGridViewTextBoxEditingControl)) 
       return; 
      gv.BeginEdit(false); 
      var textBox = (TextBox)gv.EditingControl; 
      textBox.SelectionStart = textBox.Text.Length; 
     }; 
    } 
+1

你處理事件(http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx)和lambda表達式(http://msdn.microsoft .com/en-us/library/bb397687.aspx) – juharr 2014-10-07 15:43:13

回答

0

你看到的是一個Lambda表達式。 Lambda表達式是一種非常簡潔的方法內聯定義的語法,即所謂的匿名代理。

,而不用聲明的......

private void Cell_StateChanged(object sender, EventArgs args) 
{ 
    some code; 
} 

...和事件聲明...

gv.CurrentCellDirtyStateChanged += Cell_StateChanged; 

...你寫

gv.CurrentCellDirtyStateChanged += (sender, args) => { some code; }; 

前面的部分=>(發音爲「去」)是參數列表。這些類型不需要聲明,因爲它們是從事件CurrentCellDirtyStateChanged的聲明中推斷出來的。

=>右邊的部分是方法體。

最後的分號與gv.CurrentCellDirtyStateChanged += Cell_StateChanged;的分號只是分號。

你甚至可以刪除括號,如果只有一個說法:

gv.CurrentCellDirtyStateChanged += (sender, args) => Print(args); 

Lambda表達式也可以用於功能的方法:

Func<double, double> f = x => x * x; // You can drop the() if there is only 1 argument 

這裏x => x * x執行相同計算爲

private double Square(double x) 
{ 
    return x * x; 
} 

作業Func<double, double> f = x => x * x;Func<double, double> f = Square;是等同的。所以

double y = f(3); 
// y = 9 

我沒有解釋+=呢。該運算符用於將事件處理程序附加到事件。在VB中,你會更明確地

AddHandler gv.CurrentCellDirtyStateChanged, AddressOf Cell_StateChanged 
+0

謝謝你的例子。 – 2014-10-08 02:09:26

0

寫一個整體解釋,所有的方法確實是在DataGridView事件分配給一個匿名函數(lambda表達式)。

現在的語法:

  • +=被添加到左邊的事件右側的操作數。事件是多播委託,所以一個事件調用可以觸發多個功能(因此,「+ =」而不是「=」,您將添加到列表中)。

  • =>是lambda語法的一部分。通常,lambda看起來像(<args>) => { expressions }。有簡寫版​​本,但您的示例遵循此語法。在英語中,當遇到這個符號時,我們會說「那樣」。

  • 在關閉}之後有一個;用於lambda表達式,因爲您正在完成一個語句,即分配給該事件的語句。

+0

謝謝。希望我可以將兩者都標記爲答案,因爲你的解釋清晰簡潔,比接受的答案更容易理解。 – 2014-10-08 02:08:06

+0

@ThomAsh另一個答案肯定是更完整的:)不過,很高興我能幫上忙。 – BradleyDotNET 2014-10-08 02:31:33