2014-10-07 78 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